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

ここにウェブサイトのスナップショットがあります。次のプログラムは、この画像を一定の幅と高さの画像(100 x 100)にリサイズします。

mkyong.jpg(640 x 310) – 46KB


mkyong、title = "mkyong"、width = 640、height = 310

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

結果を見る:

| =========================================== ====================== | JPG(4KB)| PNG(9KB)| JPGヒント(4KB)| PNGヒント(9KB)

|画像://wp-content/uploads/2009/09/mkyong

jpg.jpg[mkyong

jpg、タイトル= “mkyong

jpg”、幅= 100、高さ= 100]|画像://WP-コンテンツ/アップロード/2009/09/mkyong

png.jpg[mkyong

png、タイトル= “mkyong

png”、幅= 100、高さ= 100]|画像://wp-content/uploads/2009/09/mkyong

hint

jpg.jpg[mkyong

hint

jpg、タイトル= “mkyong

hint

jpg”、幅= 100 、高さ= 100]|画像://wp-content/uploads/2009/09/mkyong

hint

png.jpg[mkyong

hint

png、タイトル= “mkyong

hint

png”、幅= 100、高さ= 100]| ========= ========================================== ============

結論

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


P.Sあなたがいくつか知っていれば、Javaの画像のヒントを共有してください:)