Resizing an image in Java to reduce image size

I have an image to say dimensions of 800x800, the size of which is 170 kb. I want to resize this image to say 600x600. After resizing, I want to reduce the size of the image. How can i do this?

+6
source share
3 answers

You do not need a fully functional image processing library to easily resize an image.

The recommended approach is to use progressive bilinear scaling , for example (feel free to use this method, as in your code):

public BufferedImage scale(BufferedImage img, int targetWidth, int targetHeight) { int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; BufferedImage ret = img; BufferedImage scratchImage = null; Graphics2D g2 = null; int w = img.getWidth(); int h = img.getHeight(); int prevW = w; int prevH = h; do { if (w > targetWidth) { w /= 2; w = (w < targetWidth) ? targetWidth : w; } if (h > targetHeight) { h /= 2; h = (h < targetHeight) ? targetHeight : h; } if (scratchImage == null) { scratchImage = new BufferedImage(w, h, type); g2 = scratchImage.createGraphics(); } g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.drawImage(ret, 0, 0, w, h, 0, 0, prevW, prevH, null); prevW = w; prevH = h; ret = scratchImage; } while (w != targetWidth || h != targetHeight); if (g2 != null) { g2.dispose(); } if (targetWidth != ret.getWidth() || targetHeight != ret.getHeight()) { scratchImage = new BufferedImage(targetWidth, targetHeight, type); g2 = scratchImage.createGraphics(); g2.drawImage(ret, 0, 0, null); g2.dispose(); ret = scratchImage; } return ret; } 

The code is changed and cleared from the original in Filthy Rich Clients .


Based on your comment, you can reduce the quality and encode JPEG bytes like this:

image - BufferedImage.

 ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next(); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(0.2f); // Change this, float between 0.0 and 1.0 writer.setOutput(ImageIO.createImageOutputStream(os)); writer.write(null, new IIOImage(image, null, null), param); writer.dispose(); 

Now, since os is a ByteArrayOutputStream , you can encode it with Base64.

 String base64 = Base64.encode(os.toByteArray()); 
+13
source

You can use the 100% Java, Apache2 open source imgscalr library (one static class) and do something like this:

 import org.imgscalr.Scalr.*; // static imports are awesome with the lib ... some class code ... // This is a super-contrived method name, I just wanted to incorporate // the details from your question accurately. public static void resizeImageTo600x600(BufferedImage image) { ImageIO.write(resize(image, 600), "JPG", new File("/path/to/file.jpg")); } 

NOTE If the above value looks odd, static import allows me to directly use the resize call without specifying Scalr.resize (...)

In addition, if the quality of the recorded scaled image does not look good enough (it will be written out quickly), you can use more arguments for the resize method like this:

 public static void resizeImageTo600x600(BufferedImage image) { ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600), "JPG", new File("/path/to/file.jpg")); } 

.. and you can even apply BufferedImageOp to the result to soften it if zooming out showed that the image looks jagged:

 public static void resizeImageTo600x600(BufferedImage image) { ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600, Scalr.OP_ANTIALIAS), "JPG", new File("/path/to/file.jpg")); } 

You can start playing with the library by simply adding the following dep entry to your Maven POM (imgscalr is in Maven's central repo):

 <dependency> <groupId>org.imgscalr</groupId> <artifactId>imgscalr-lib</artifactId> <version>4.2</version> <type>jar</type> <scope>compile</scope> </dependency> 
+5
source

Use some nice frameworks that support image processing through Java, for example. IamageJ

There is also basic support available in Java through some classes such as MemoryImageSource and PixelGrabber .

+3
source

Source: https://habr.com/ru/post/927663/


All Articles