【问题标题】:Image changes color when saved with java [duplicate]使用java保存时图像会改变颜色[重复]
【发布时间】:2013-12-27 02:37:11
【问题描述】:

当我保存这张图片时:

用这个方法:

private final static Path ROOT_PATH = Paths.getPath("C:/images");

private static void saveImageFromWebSimple(final String url) {
    URL u = null;
    try {
        u = new URL(url);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String file = url.substring(url.indexOf("//") + 2);
    Path filePath = ROOT_PATH.resolve(file);
    try {
        Files.createDirectories(filePath.getParent());
        BufferedImage img = ImageIO.read(u);
        ImageIO.write(img, "jpg", filePath.toFile());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我的结果:

但并非所有图片都会出现这种情况。

你能告诉我为什么吗?

【问题讨论】:

  • 1) ImageIO.write(img, "jpg", filePath.toFile()); JPEG 不能保证保留 准确 颜色,但我认为这超出了它通常会改变它们的范围。 2)如果下载它,只需“逐字节”保存它,而不是使用ImageIO(用于读取写入)。
  • 如果使用ImageIO 加载该图像并直接显示它(不涉及任何保存到磁盘),我们可以看到相同的结果。我以前见过这个,但忘记了原因,因此很难找到答案..
  • 好像是这样。在问这个 Q 之前我已经做过研究,但没有发现。我从原版链接到这个 Q 以获得更多关注,因为它并没有真正关闭恕我直言。
  • “这不是真的恕我直言。” 这不是真的什么?
  • 现在是有道理的。感谢您的澄清。

标签: java bufferedimage javax.imageio


【解决方案1】:

根据@uckelman 在this post 上的comment,当图像缺少 JFIF 标头时,Java 的解码器对图像格式的假设与大多数其他渲染不同:

我相信您关于如何检测不良 JPEG 问题的答案 找到herehere。您所拥有的是没有 JFIF 标记的 JPEG。 在这种情况下,所有其他图像加载器都假定数据是 YCbCr, ImageIO 除外,它假设通道 1 和 2 时是 RGB 不进行二次抽样。所以,检查前4个字节是否为FF D8 FF E1,如果是,是否对通道 1 和 2 进行二次采样。那是 需要转换的情况。

【讨论】:

  • 感谢 antiduh 但也请投票支持@uckleman 的评论!
  • 我将此添加到另一个答案中,但万一有人在这里偶然发现:我遇到了这个问题,我实际上找到了一个第三方库来为我处理这个问题。 github.com/haraldk/TwelveMonkeys 从字面上看,我所要做的就是将它包含在我的 maven 依赖项中,然后以奇怪颜色出现的 jpeg 开始正常读取。我什至不必更改一行代码。
  • 我衷心赞同@JamesFiala 的评论——在读到我在我的 Clojure 项目中试一试之后,它解决了我的问题。一个非常简单的解决方案。谢谢詹姆斯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2018-04-14
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
相关资源
最近更新 更多