【发布时间】:2019-10-26 01:42:03
【问题描述】:
我需要缩小 JPG 图像,使其适合 1024x640 的矩形并保存,使其大小不超过 20 kB。通过一些谷歌搜索,我设法做到了这两点。对于我使用的缩放比例
private static BufferedImage scale(BufferedImage input, int width, int height) {
final int type = input.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
final BufferedImage result = new BufferedImage(width, height, type);
final Graphics2D g2 = result.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(input, 0, 0, width, height, null);
g2.dispose();
return result;
}
为了减小大小,我使用ImageWriter 和JPEGImageWriteParam 并以降低质量重复,直到文件大小低于限制。
它在我的机器上运行得相当好,但在测试服务器上,它做的事情很糟糕:
original file size: 174548
scaled down file size: 16995 - on my machine
228218 - on the server
所以缩小后的图片比原图大,画质很差。
我虽然可能与headless java problem有关,但java安装不是无头的(我从来没有得到HeadlessException):
java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
知道发生了什么吗?
【问题讨论】:
-
问题可能是大量的元数据。我不了解 Java,但在命令行中,您可以使用 -strip 删除大部分(如果不是全部)元数据。同样在命令行中,有一个定义允许 Imagemagick 输出您想要的文件大小。请参阅 -define jpeg:extent={size} imagemagick.org/Usage/formats/#jpg_write
标签: java image-processing headless