imgscalr与背景红色
问题内容:
我正在使用(org.imgscalr.Scalr)库来调整某些图像的大小,但是在调整大小后,背景变成红色。我的代码是:
BufferedImage imagemPng = ImageIO.read(image);
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937);
你能帮助我吗?
谢谢
问题答案:
您忽略的其余代码(保存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编码器,以告诉它不要压缩得太多(请阅读本文)- -这很少有问题,但是在过去,当人们说“
imgscalr看起来很糟糕!”时,问题就出现了。-事实证明BufferedImage确实不错且清晰,但是Java编码器过于积极地压缩结果。
我一直想通过在imgscalr库中添加一些其他IO帮助器来解决Java图像中这些烦人的问题,因此您可以加载文件并保存它们,而不必担心这些琐碎的细节。