imgscalr与背景红色

时间:2013-07-19 20:34:18

标签: java imgscalr

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

BufferedImage imagemPng = ImageIO.read(image);
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937);
你可以帮帮我吗?

谢谢

1 个答案:

答案 0 :(得分:19)

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

我愿意打赌1美元,你的PNG中有一个alpha通道,而JPG不支持alpha;遗憾的是,Java的JPG编码器不知道忽略你传入的BufferedImage上的Alpha通道,它将丢弃其中一个REAL颜色通道(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编码器来告诉它不要压缩这么多(read this) - 这很少是一个问题,但是过去人们说“imgscalr看起来很糟糕!” - 事实证明BufferedImage真的很好而且很清晰,但Java编码器过于积极地压缩结果。

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