【问题标题】:imgscalr with background red带红色背景的 imgscalr
【发布时间】:2019-06-02 15:38:12
【问题描述】:

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

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

你能帮帮我吗?

谢谢

【问题讨论】:

  • 你完全只是问了这个问题。
  • 可能与从pngjpg 的透明背景有关。
  • 有什么可以设置颜色背景的吗?

标签: java imgscalr


【解决方案1】:

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

我愿意赌 1 美元,您的 PNG 有一个 alpha 通道,而 JPG 不支持 alpha;不幸的是,Java 的 JPG 编码器不知道忽略您传入的 BufferedImage 上的 Alpha 通道,它会丢弃真实颜色通道 (R/G/B) 之一,转而写出 alpha 值而不是其中一个颜色通道.

例如,如果您有:

ARGB

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

【讨论】:

  • 你是这个问题的专家。问题是当我将图像从 png 转换为 jpg 时,但现在问题已解决。我从这个错误中学到了很多。非常感谢!!!
  • 嗨@RiyadKalla,我面临着类似的问题。我尝试通过检查原始图像上的 alpha 通道来调试它,但它总是返回 false。我在两台具有相同 Java 和操作系统的服务器上部署了相同的应用程序,一个应用程序总是产生彩色背景,另一个产生正确调整大小的图像。当我重新启动tomcat时,它可以解决问题。我真的很难理解为什么会发生这种情况。如果可能的话,您能否提供任何见解。谢谢。
  • @ShriramSharma 呃...这很棘手...我想好消息是它听起来最有可能是一个环境问题...意味着关于版本运行 Tomcat 或 Tomcat 本身的 JDK/JRE 可能有点不同......如果你能完全匹配这两个系统,你应该很高兴。此外,如果测试图像不同,可能会导致...通道顺序没有明确定义...例如,图像可以是 ARGB 或 RGBA...因此,如果您使用不同的图像,它们可能具有 alpha 通道,这只是当一个被淘汰时很好,当另一个被淘汰时,就不好了。
  • 这个问题在提出的解决方案旁边讨论了这个问题。 github.com/rkalla/imgscalr/issues/82
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2016-11-24
  • 2018-11-02
相关资源
最近更新 更多