Javaでイメージのサイズを変更するには?

Javaで画像のサイズを変更するには?

私はJava画像処理の専門家ではありませんが、この画像のサイズ変更機能をユーザー画像アップロードフォームに実装する機会が与えられました。

Graphics2Dは、次のように画像のサイズ変更機能を提供しています。

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();

一部の記事によると、サイズ変更された画像の品質を高めたい場合は、次のようにRenderingHintsを追加できます。

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. 例

以下はWebサイトのスナップショットです。次のプログラムは、この画像のサイズを固定幅と高さの画像(100 x 100)に変更します。

example.jpg (640 x 310) – 46KB

example

2. ソースコード

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;
    }
}

結果を見る:

JPG(4KB)

PNG(9KB)

JPG +ヒント(4KB)

PNG +ヒント(9KB)

example_jpg

example_png

example_hint_jpg

example_hint_png

結論

サイズ変更された画像を見ると、サイズ変更されたPNG画像のファイルサイズはサイズ変更されたJPEG画像よりも大きくなりますが、サイズ変更後のPNG品質はJPGよりも優れています。 ヒントはJPG形式では効果を発揮しませんが、PNGとPNG +ヒントの間に違いは見られませんでした。レンダリングヒントを追加するように言われたとしても、画質は向上しますか。

P.S Please share Java image tips if you know some :)