我正在使用(org.imgscalr.Scalr)库来调整一些图像的大小,但在调整大小后背景会变成红色。我的代码是:
BufferedImage imagemPng = ImageIO.read(image);
BufferedImage imagemJpg = Scalr.resize(imagemPng, Method.QUALITY, 1920, 937);你能帮帮我吗?
谢谢
发布于 2013-07-23 13:22:54
您省略的代码的其余部分( ImageIO保存)以及您正在读取的PNG是否具有透明通道(正如@Daft Punk指出的)是这里的重要部分。
我敢打赌$1,您的PNG中有一个alpha通道,而JPG不支持alpha;不幸的是,Java编码器不知道忽略您传入的BufferedImage上的Alpha通道,它将丢弃一个真实的颜色通道(R/G/B),以便写出Alpha值,而不是那些颜色通道中的一个。
例如,如果您有:
ARGBJava JPG编码器将写出以下3个通道,认为它们是RGB:
[ARG]并丢弃蓝色通道。
幸运的是,修复方法非常简单。只需创建一个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镜像中的这些令人讨厌的问题,这样您就可以加载文件并保存它们,而不必担心这些细节细节。
https://stackoverflow.com/questions/17755036
复制相似问题