How to resize an image in Java ?
I’m not the expert in Java image processing, it’s a chance given to implement this re-sized feature in user image upload form, which request re-sized the large image to smaller size and fixed width and height.
Graphics2D is providing the image re-size feature as follow :
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose();
According to some articles, if you want to increase the re-sized image quality, you can add the RenderingHints as follow :
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose(); g.setComposite(AlphaComposite.Src); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Example
Here is a website snapshot, the following program will re-size this image to a fixed width and height image (100 x 100).
mkyong.jpg (640 x 310) – 46KB

Source code
import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; /* * @author mkyong * */ public class ImageTest { private static final int IMG_WIDTH = 100; private static final int IMG_HEIGHT = 100; public static void main(String [] args){ try{ BufferedImage originalImage = ImageIO.read(new File("c:\\image\\mkyong.jpg")); int type = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType(); BufferedImage resizeImageJpg = resizeImage(originalImage, type); ImageIO.write(resizeImageJpg, "jpg", new File("c:\\image\\mkyong_jpg.jpg")); BufferedImage resizeImagePng = resizeImage(originalImage, type); ImageIO.write(resizeImagePng, "png", new File("c:\\image\\mkyong_png.jpg")); BufferedImage resizeImageHintJpg = resizeImageWithHint(originalImage, type); ImageIO.write(resizeImageHintJpg, "jpg", new File("c:\\image\\mkyong_hint_jpg.jpg")); BufferedImage resizeImageHintPng = resizeImageWithHint(originalImage, type); ImageIO.write(resizeImageHintPng, "png", new File("c:\\image\\mkyong_hint_png.jpg")); }catch(IOException e){ System.out.println(e.getMessage()); } } private static BufferedImage resizeImage(BufferedImage originalImage, int type){ BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose(); return resizedImage; } private static BufferedImage resizeImageWithHint(BufferedImage originalImage, int type){ BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose(); g.setComposite(AlphaComposite.Src); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); return resizedImage; } }
Result
| JPG (4KB) | PNG (9KB) | JPG + Hints (4KB) | PNG + Hints (9KB) |
|
|
|
|
Conclusion
As you see the re-sized image , the file size of the re-sized PNG image is larger than the re-sized JPEG image, but the PNG quality is more better than JPG after re-sized. The hints will not take any effect in JPG format, however i didn’t see any different between PNG and PNG + hints either, even someone told about adding the rendering hints will increase the image quality?
P.S Please share java image tips if you know some
Reference
1) http://java.sun.com/j2se/1.4.2/docs/api/javax/imageio/ImageIO.html
2) http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/BufferedImage.html
3) http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Graphics2D.html
4) http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
5) http://www.servletsuite.com/servlets/imagescale.htm
6) http://www.componenthouse.com/article-20



Thanks for the contribution, really appreciated it.
Check out http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html and http://www.componenthouse.com/article-20
Hi,
I think you have set the Hints before drawing, so they will be recognized and you should use the method for g.addHints(..), so you can give them all. In your way I think you will be overwritten every time using the set-Method.
Last but not least you should add some kind of calculation for the image size, because often your picture won’t be 100×100. Often they will be something like 100×67 or so.
So you could calculate which is the greatest length, scale that down to your size you want to have and then use this scale factor to calculate the other length.
Hope this helps a little bit. If you write me an email.
Bye,
Daniel