imgscalr 带红色背景

8

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

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

你能帮我吗?

谢谢


你刚刚完全问了这个问题。 - Slater Victoroff
可能是由于透明背景从“png”转换为“jpg”引起的问题。 - user1181445
有没有什么方法可以设置背景颜色? - Rafael Pereira Delfino
1个回答

19

你省略的代码部分(ImageIO save)和你正在读取的PNG文件是否具有透明通道(如@Daft Punk所指出的),这些是重要的部分。

我敢打赌1美元,你的PNG文件中有一个Alpha通道,而JPG不支持Alpha通道;不幸的是,Java的JPG编码器不知道忽略你传递的BufferedImage中的Alpha通道,并且它将放弃其中一个真正的颜色通道(R/G/B),以便写出Alpha值而不是这些颜色通道之一。

例如,如果你有:

ARGB

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

[ARG]

并丢弃蓝色通道。

幸运的是,这个修复很简单。只需创建一个新的BufferedImage,类型为TYPE_INT_RGB,像这样:

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图像中的这些小麻烦,这样您就可以加载文件并保存它们,而不必担心这些琐碎的细节。


您是这个问题的专家。问题出在我将图像从png转换为jpg时,但现在问题已经解决了。我从这个错误中学到了很多。非常感谢您! - Rafael Pereira Delfino
嗨@RiyadKalla,我遇到了类似的问题。我尝试通过检查原始图像上的alpha通道来调试它,但它总是返回false。我在两个具有相同Java和操作系统的服务器上部署了相同的应用程序,其中一个应用程序始终产生彩色背景,而另一个应用程序则产生正确的调整大小的图像。当我重新启动tomcat时,它会解决这个问题。对于我来说,理解为什么会发生这种情况变得非常困难。如果可能,请提供任何见解。谢谢。 - Shriram Sharma
@ShriramSharma 嗯...这有点棘手...我猜好消息是,它听起来很可能是一个环境问题...意思是JDK/JRE版本或Tomcat本身的某些东西可能有点不同...如果你能精确匹配两个系统,你应该就可以了。另外,如果测试图像不同,可能会导致这种情况...通道顺序没有明确定义...例如,一幅图像可以是ARGB或RGBA...所以如果你使用不同的图像,它们可能具有alpha通道,只是当其中一个被剔除时没问题,而当另一个被剔除时就不行了。 - Riyad Kalla
这个问题讨论了一个提出的解决方案。https://github.com/rkalla/imgscalr/issues/82 - Amin Heydari Alashti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接