8

我正在使用(org.imgscalr.Scalr)库来调整一些图像的大小,但是在调整大小后背景变成红色。我的代码是:

BufferedImage imagemPng = ImageIO.read(image);
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937);

你能帮助我吗?

谢谢

4

1 回答 1

19

您省略的其余代码(ImageIO 保存)以及您正在读取的 PNG 是否具有透明通道(正如@Daft Punk 指出的那样)是这里的重要部分。

我愿意赌 1 美元,你的 PNG 有一个 alpha 通道,而 JPG 不支持 alpha;不幸的是,Java 的 JPG 编码器不知道忽略您传入的 BufferedImage 上的 Alpha 通道,它会丢弃真实颜色通道 (R/G/B) 之一,转而写出 alpha 值而不是其中一个颜色通道.

例如,如果您有:

ARGB

Java JPG 编码器将写出以下 3 个通道,认为它们是 RGB:

[ARG]

并丢弃 BLUE 通道。

幸运的是,修复非常简单。只需创建一个TYPE_INT_RGB类型的新 BufferedImage,如下所示:

BufferedImage imageToSave = new BufferedImage(imagemJpg.getWidth(), imagemJpg.getHeight(), BufferedImage.TYPE_INT_RGB);

那么您需要使用 Alpha 通道“渲染” BufferedImage,以剥离 Alpha 通道:

Graphics g = imageToSave.getGraphics();
g.drawImage(imagemJpg, 0, 0, null);

现在您可以将生成的imageToSave图像保存为 JPG,它看起来会很好。

提示:不要忘记,如果您不喜欢图像的外观(模糊、伪影等),您需要将参数直接传递给 Java JPG 编码器,告诉它不要压缩太多(阅读此内容)- - 这很少是一个问题,但过去当人们说“imgscalr 看起来很糟糕!”时就会出现这种情况。-- 事实证明 BufferedImage 非常漂亮和清晰,但是 Java 编码器过于激进地压缩结果。

我一直想通过向 imgscalr 库添加一些额外的 IO 帮助程序来解决 Java 图像中这些恼人的小问题,这样您就可以加载文件并保存它们,而不必担心这些细节。

于 2013-07-23T05:22:53.807 回答