我正在使用 (org.imgscalr.Scalr) 图像库来调整一些图片大小,但是当缩放后,背景会变成红色。我的代码如下:
BufferedImage imagemPng = ImageIO.read(image);
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937);
你能帮我吗?
谢谢
我正在使用 (org.imgscalr.Scalr) 图像库来调整一些图片大小,但是当缩放后,背景会变成红色。我的代码如下:
BufferedImage imagemPng = ImageIO.read(image);
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937);
你能帮我吗?
谢谢
你省略的代码部分(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图像中的这些小麻烦,这样您就可以加载文件并保存它们,而不必担心这些琐碎的细节。