Java BuffereImage.getScaledInstance()未调整图像大小

Java BuffereImage.getScaledInstance()未调整图像大小,java,bufferedimage,javax.imageio,Java,Bufferedimage,Javax.imageio,我在理解这行代码时遇到一些问题: bufferedImage.getScaledInstance(100, -1, Image.SCALE_SMOOTH); 我用它来调整以下数字的图像大小。宽度:3264px,高度:2448px,水平和垂直分辨率:150dpi,大小:2.72MB 然后我使用 ImageIO.write(bufferedImage, "jpg", outputFile); 它产生了一幅具有以下数字的图片:相同的宽度和高度(3264x2448),水平和垂直分辨率:96dpi,大

我在理解这行代码时遇到一些问题:

bufferedImage.getScaledInstance(100, -1, Image.SCALE_SMOOTH);
我用它来调整以下数字的图像大小。宽度:3264px,高度:2448px,水平和垂直分辨率:150dpi,大小:2.72MB

然后我使用

ImageIO.write(bufferedImage, "jpg", outputFile);
它产生了一幅具有以下数字的图片:相同的宽度和高度(3264x2448),水平和垂直分辨率:96dpi,大小:674KB

图片的宽度不应该是
100px
,而保持纵横比的高度应该是多少(根据Javadoc)?为什么结果图片的宽度和高度相同,但分辨率和大小不同?我是否遗漏了什么,因为无论宽度和高度的值是多少,结果pic始终与上面描述的相同

我还读到,我应该将调整大小的
buffereImage
绘制到
Graphics2D
中,并将
Graphics2D
保存到文件中。这是正确的方法,而不是直接将
BufferedImage
保存到文件中吗


我使用的图像是

您没有得到
.getScaledInstance()
的响应。它不修改
缓冲图像
,但返回缩放图像实例。由于使用了“jpg”,您可能会在输出图像中更改分辨率

因此,您必须执行以下操作:

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

要从缩放的
图像创建
缓冲区图像
,请使用以下命令。

您没有得到
.getScaledInstance()的响应。它不修改
缓冲图像
,但返回缩放图像实例。由于使用了“jpg”,您可能会在输出图像中更改分辨率

因此,您必须执行以下操作:

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

要从缩放的
图像
创建
缓冲图像
,请使用以下命令。

检查其,它显示“如果宽度或高度为负数,则替换一个值以保持原始图像尺寸的纵横比”。我猜它无法保持1px宽度的相同纵横比,并重置为原始尺寸。纵横比保持不变,但尺寸不应保持不变。在我的例子中,当我尝试调整维度的大小时,维度也会保持不变。您会得到
.getScaledInstance()
的响应,对吗?它不修改
缓冲图像
,但返回缩放图像实例。如果没有,您可能正在编写非缩放图像,并且由于使用了
“jpg”
,您可能会在输出图像中更改分辨率。哦,不,我完全没有。我认为它可以直接扩展。我猜这就是为什么你必须使用Graphics2D来处理返回的图像。我将尝试并更新此线程。非常感谢你!您不需要
图形2d
getScaledInstance()
返回一个
Image
对象,只需尝试获取它的响应,然后对该对象执行
write()
<代码>图像缩放图像=缓冲图像.getScaledInstance(100,-1,图像.SCALE\u平滑)
ImageIO.write(scaleImage,“jpg”,outputFile)检查它,它说“如果宽度或高度为负数,则替换一个值以保持原始图像尺寸的纵横比”。我猜它无法保持1px宽度的相同纵横比,并重置为原始尺寸。纵横比保持不变,但尺寸不应保持不变。在我的例子中,当我尝试调整维度的大小时,维度也会保持不变。您会得到
.getScaledInstance()
的响应,对吗?它不修改
缓冲图像
,但返回缩放图像实例。如果没有,您可能正在编写非缩放图像,并且由于使用了
“jpg”
,您可能会在输出图像中更改分辨率。哦,不,我完全没有。我认为它可以直接扩展。我猜这就是为什么你必须使用Graphics2D来处理返回的图像。我将尝试并更新此线程。非常感谢你!您不需要
图形2d
getScaledInstance()
返回一个
Image
对象,只需尝试获取它的响应,然后对该对象执行
write()
<代码>图像缩放图像=缓冲图像.getScaledInstance(100,-1,图像.SCALE\u平滑)
ImageIO.write(scaleImage,“jpg”,outputFile)