gpt4 book ai didi

java - 如何获得高质量的缩略图

转载 作者:太空狗 更新时间:2023-10-29 22:35:54 24 4
gpt4 key购买 nike

我正在尝试使用 Java 和 Scalr 3.2 创建这张图片的高质量缩略图

full scale image

这是相关的源代码,其中 THUMB_WIDTH = 77THUMB_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",结果如下:

png thumbnail

如果我使用 format = "jpg",结果如下:

jpg thumbnail

imagemagick identify我发现 JPEG 以 75 的质量保存,这完全不足以创建一个好看的缩略图。 PNG 对我来说也不好看。

这是原始文件和两个缩略图的标识输出:

$ 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?我想尝试更高的质量并比较结果。我在 ImageIO.write 的 JavaDoc 中找不到任何内容。
  • 为什么我告诉 Scalr 我的最大尺寸是 77x57 而它输出的图像是 77x58?我认为这是为了保持比例,但那些是我的最大宽度和最大高度。宽度或高度可以更小但不能更多。

更新:通过网络搜索,我找到了一篇关于如何 adjust JPEG image compression quality 的文章.我编写了自己的方法来保存设置质量的 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:

png thumbnail

JPEG 质量 75:

jpg thumbnail

JPEG quality 90(stackoverflow上的头像保存为JPEG quality 90):

jpg thumbnail quality 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:

jpg thumb from scalr

使用 java-image-scaling 生成的 JPEG 质量 90:

jpg thumb from java-image-scaling

我没有收到任何进一步的反馈,所以我个人的结论是 java-image-scaling 提供了卓越的质量,所以它是我选择的库。

最佳答案

@Stivlo,很抱歉没有回复这个问题,我从来没有收到 SO 关于这个问题的任何通知。

java-image-scaling 确实有一些不错的过滤器可以帮助您在需要时进行微调。也就是说,在 imgscalr 的 v4.2 中,我添加了新的 ULTRA_QUALITY。这可能会让您更接近您想要的。

我希望这能有所帮助,但不幸的是,我意识到这是在事发将近一年后才得到回复的。对此感到抱歉。

关于java - 如何获得高质量的缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com