【问题标题】:BufferedImage.getScaledInstance() not resizing imageBufferedImage.getScaledInstance() 不调整图像大小
【发布时间】: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 来处理返回的图像。我会尝试并更新此线程。非常感谢!
  • 你不需要Graphics2DgetScaledInstance() 返回一个 Image 对象,尝试获取它的响应,然后在该对象上使用 write()Image scaledImage = bufferedImage.getScaledInstance(100, -1, Image.SCALE_SMOOTH);ImageIO.write(scaledImage, "jpg", outputFile);

标签: java bufferedimage javax.imageio


【解决方案1】:

您没有收到.getScaledInstance() 的回复。它不会修改bufferedImage,而是返回缩放后的图像实例。由于“jpg”的使用,您可能会在输出图像中获得分辨率变化。

因此您必须执行以下操作;

Image scaledImage = bufferedImage.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
// map Image to BufferedImage
ImageIO.write(scaledBufferedImage, "jpg", outputFile);

要从缩放的Image 创建BufferedImage,请使用以下answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多