Comment redimensionner une image en Java?
Je ne suis pas l'expert du traitement d'image Java, mais une chance donnée d'implémenter cette fonctionnalité redimensionnée dans le formulaire de téléchargement d'image utilisateur, qui demande de redimensionner la grande image à une taille plus petite avec une largeur et une hauteur fixes.
Graphics2D fournit la fonction de redimensionnement d'image comme suit:
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();
Selon certains articles, si vous souhaitez augmenter la qualité d'image redimensionnée, vous pouvez ajouter les RenderingHints comme suit:
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);
1. Exemple
Voici un instantané du site Web, le programme suivant redimensionnera cette image en une largeur et une hauteur fixes (100 x 100).
example.jpg (640 x 310) – 46KB
2. Code source
ImageTest.java
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 example * */ 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\\example.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\\example_jpg.jpg")); BufferedImage resizeImagePng = resizeImage(originalImage, type); ImageIO.write(resizeImagePng, "png", new File("c:\\image\\example_png.jpg")); BufferedImage resizeImageHintJpg = resizeImageWithHint(originalImage, type); ImageIO.write(resizeImageHintJpg, "jpg", new File("c:\\image\\example_hint_jpg.jpg")); BufferedImage resizeImageHintPng = resizeImageWithHint(originalImage, type); ImageIO.write(resizeImageHintPng, "png", new File("c:\\image\\example_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; } }
Voir résultat:
JPG (4 Ko) |
PNG (9 Ko) |
JPG + astuces (4 Ko) |
PNG + astuces (9 Ko) |
Conclusion
Comme vous voyez l'image redimensionnée, la taille du fichier de l'image PNG redimensionnée est plus grande que l'image JPEG redimensionnée, mais la qualité PNG est meilleure que JPG après redimensionnement. Les indices ne prendront aucun effet au format JPG, mais je n'ai pas vu non plus de différence entre les indices PNG et PNG +, même quelqu'un a dit que l'ajout des indices de rendu augmenterait la qualité de l'image?
P.S Please share Java image tips if you know some :)