質問: 当方java初心者の者です。現在、画像を取り込み縦横比を維持したまま指定した大きさにリサイズしてBUfferedImageで返すプログラムを書きたいのですが何をどうすればよいかがわかりません。できるだけ画質は落としたくないのですが...画像や描画の仕組みに疎い節もありかなり難航しております。アドバイスまたはサンプルや画像の仕組みについてわかりやすく解説してくださっているサイトなどがあれば教えていただけると幸いです。どうかよろしくお願いします。
回答: 画質はどうかわかりませんが、標準ライブラリでやるのが簡単だと思います。 のあたりを参考にしました。 次のようなプログラムではどうでしょうか? ファイル名やサイズは適宜置き換えてください。 ``` import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.AreaAveragingScaleFilter; import java.awt.image.BufferedImage; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.awt.image.ImageProducer; import java.io.File; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { BufferedImage bi = scaleImage(new File("src.jpg"), 100, 150); // 2番目の引数が画像の形式、3番目がファイル名 ImageIO.write(bi, "jpeg", new File("dest.jpg")); } /** * * @param in 読み込むファイル * @param destWidth 出力する画像の横の最大サイズ * @param destHeight 出力する画像の縦の最大サイズ * @return BufferedImage * @throws IOException */ public static BufferedImage scaleImage(File in, int destWidth, int destHeight) throws IOException { BufferedImage src = ImageIO.read(in); int width = src.getWidth(); // オリジナル画像の幅 int height = src.getHeight(); // オリジナル画像の高さ // 縦横の比率から、scaleを決める double widthScale = (double) destWidth / (double) width; double heightScale = (double) destHeight / (double) height; double scale = widthScale < heightScale ? widthScale : heightScale; ImageFilter filter = new AreaAveragingScaleFilter( (int) (src.getWidth() * scale), (int) (src.getHeight() * scale)); ImageProducer p = new FilteredImageSource(src.getSource(), filter); Image dstImage = Toolkit.getDefaultToolkit().createImage(p); BufferedImage dst = new BufferedImage( dstImage.getWidth(null), dstImage.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D g = dst.createGraphics(); g.drawImage(dstImage, 0, 0, null); g.dispose(); return dst; } } ```