JavaとScalr3.2を使用して、この画像の高品質のサムネイルを作成しようとしています。
THUMB_WIDTH = 77
これは関連するソースコードです。THUMB_HEIGHT = 57
BufferedImage srcImg = ImageIO.read(new File(sourceFile));
BufferedImage dstImg = Scalr.resize(srcImg, Scalr.Method.QUALITY,
THUMB_WIDTH, THUMB_HEIGHT);
ImageIO.write(dstImg, format, new File(destFile));
を使用format = "png"
すると、結果は次のようになります。
を使用format = "jpg"
すると、結果は次のようになります。
imagemagickidentifyを使用すると、JPEGが75の品質で保存されていることがわかりました。これは、見栄えの良いサムネイルを作成するにはまったく不十分です。PNGは私にも似合いません。
元のファイルと2つのサムネイルのIDの出力は次のとおりです。
$ identify 42486_1.jpg 42486_s1.jpg 42486_s1.png
42486_1.jpg JPEG 580x435 580x435+0+0 8-bit DirectClass 50.6KB 0.000u 0:00.000
42486_s1.jpg[1] JPEG 77x58 77x58+0+0 8-bit DirectClass 2.22KB 0.000u 0:00.000
42486_s1.png[2] PNG 77x58 77x58+0+0 8-bit DirectClass 12.2KB 0.000u 0:00.000
質問
- 生成されたサムネイルの品質を向上させる方法は?
- JPEGをより高品質で保存するにはどうすればよいですか?より高い品質で試して、結果を比較したいと思います。JavaDocforImageIO.writeに何も見つかりませんでした。
- 最大サイズが77x57で、77x58の画像を出力することをScalrに伝えるのはなぜですか?それはプロポーションを維持するためだと思いますが、それが私の最大幅と最大高さです。幅または高さはこれより小さくすることはできますが、それ以上にすることはできません。
更新:Web検索で、 JPEG画像の圧縮品質を調整する方法に関する記事を見つけました。品質を設定するBufferedImageを保存する独自のメソッドを作成しました。
/**
* Write a JPEG file setting the compression quality.
*
* @param image
* a BufferedImage to be saved
* @param destFile
* destination file (absolute or relative path)
* @param quality
* a float between 0 and 1, where 1 means uncompressed.
* @throws IOException
* in case of problems writing the file
*/
private void writeJpeg(BufferedImage image, String destFile, float quality)
throws IOException {
ImageWriter writer = null;
FileImageOutputStream output = null;
try {
writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
output = new FileImageOutputStream(new File(destFile));
writer.setOutput(output);
IIOImage iioImage = new IIOImage(image, null, null);
writer.write(null, iioImage, param);
} catch (IOException ex) {
throw ex;
} finally {
if (writer != null) writer.dispose();
if (output != null) output.close();
}
}
結果は次のとおりです。PNG:
JPEG品質75:
JPEG品質90(stackoverflowのGravatarはJPEG品質90として保存されます):
およびファイルサイズ:
thumb90.jpg JPEG 77x58 77x58+0+0 8-bit DirectClass 6.89KB 0.000u 0:00.000
更新2:Scalrをjava-image-scalingと比較するためのテスト。
private void scaleAndSaveImageWithScalr(String sourceFile, String destFile, int width, int height)
throws IOException {
BufferedImage sourceImage = ImageIO.read(new File(sourceFile));
BufferedImage destImage = Scalr.resize(sourceImage, Scalr.Method.QUALITY, width, height);
writeJpeg(destImage, destFile, JPEG_QUALITY);
}
private void scaleAndSaveImageWithJImage(String sourceFile, String destFile, int width, int height)
throws IOException {
BufferedImage sourceImage = ImageIO.read(new File(sourceFile));
ResampleOp resampleOp = new ResampleOp(width, height);
resampleOp.setFilter(ResampleFilters.getLanczos3Filter());
resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.Normal);
BufferedImage destImage = resampleOp.filter(sourceImage, null);
writeJpeg(destImage, destFile, JPEG_QUALITY);
}
Scalrで生成されたJPEG品質90:
java-image-scalingで生成されたJPEG品質90:
それ以上のフィードバックはありませんでした。個人的な結論として、java-image-scalingは優れた品質を提供し、それが私が選択したライブラリです。