Add Maven Dependendy to resize image
<dependency> <groupId>org.imgscalr</groupId> <artifactId>imgscalr-lib</artifactId> <version>4.2</version> </dependency>
import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.stream.FileImageOutputStream; import org.imgscalr.Scalr; import org.imgscalr.Scalr.Method; import org.imgscalr.Scalr.Mode; ... public class ImageUtil { public static void downsizeJpg(Path sourcePath, Path targetPath, int targetWidth) throws IOException { try (InputStream isSrc = new FileInputStream(sourcePath.toFile())) { // Don't Use "ImageIO.read(File file)". It will not close the stream // Use Stream to close the resource BufferedImage sourceImage = ImageIO.read(isSrc); double width = sourceImage.getWidth(); double height = sourceImage.getHeight(); double ratio = width / height; int trgHeight = (int) (targetWidth / ratio); // If taget width is smaller than source width, start to downsize if (targetWidth < width) { BufferedImage targetImage = Scalr.resize(sourceImage, Method.QUALITY, Mode.FIT_EXACT, targetWidth, trgHeight); saveImage(targetImage, targetPath, 0.7f); // prevent upsizing. just copy the source image to target image } else { saveImage(sourceImage, targetPath, 0.7f); } } } private static void saveImage(RenderedImage image, Path targetPath, float quality) throws FileNotFoundException, IOException { // set compression level JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null); jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); jpegParams.setCompressionQuality(quality); final ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); try (FileImageOutputStream fios = new FileImageOutputStream(targetPath.toFile())) { // specifies where the jpg image has to be written writer.setOutput(fios); // save the image writer.write(null, new IIOImage(image, null, null), jpegParams); writer.dispose(); } } }
quality can be fromo 0f to 1f. 1 is the highst quality and file size get big. 0 is lowest quality and file size get small.