Comment redimensionner une image en Java?

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

example

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)

example_jpg

example_png

example_hint_jpg

example_hint_png

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 :)