【发布时间】:2017-05-02 08:04:38
【问题描述】:
我在理解这行代码时遇到了一些问题:
bufferedImage.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
我用它来调整具有以下数字的图像大小。宽度:3264px,高度:2448px,水平和垂直分辨率:150dpi,大小:2.72MB。
然后我将 bufferedImage 保存到一个文件中使用
ImageIO.write(bufferedImage, "jpg", outputFile);
生成的图片具有以下数字:宽度和高度相同 (3264x2448),水平和垂直分辨率:96dpi,大小:674KB。
图片的宽度不应该是100px,以及保持纵横比的任何高度(根据Javadoc)吗?为什么结果图片具有相同的宽度和高度,但不同的分辨率和大小?我是否遗漏了什么,因为无论宽度和高度的值是多少,结果图片总是与上述相同。
我还读到我应该将调整大小的BufferedImage 绘制到Graphics2D 中,并将Graphics2D 保存到文件中。这是正确的做法,而不是将BufferedImage 直接保存到文件中?
我使用的图片是here
【问题讨论】:
-
检查其documentation,它说“如果宽度或高度是负数,则替换一个值以保持原始图像尺寸的纵横比”。我猜它无法保持与 1px 宽度相同的纵横比,并重置为原始尺寸。
-
保持纵横比,但尺寸不应该。就我而言,尺寸也保持不变,而我正在尝试调整它的大小。
-
您收到了
.getScaledInstance()的回复,对吗?它不会修改bufferedImage,而是返回缩放后的图像实例。如果没有,您可能正在编写未缩放的图像,并且由于使用"jpg",您可能会在输出图像中获得分辨率变化。 -
哦不,我完全没有。我认为它直接缩放它。猜猜这就是为什么你必须使用 Graphics2D 来处理返回的图像。我会尝试并更新此线程。非常感谢!
-
你不需要
Graphics2D。getScaledInstance()返回一个Image对象,尝试获取它的响应,然后在该对象上使用write()。Image scaledImage = bufferedImage.getScaledInstance(100, -1, Image.SCALE_SMOOTH);和ImageIO.write(scaledImage, "jpg", outputFile);
标签: java bufferedimage javax.imageio