java - 为什么 Java ImageIO 会展平 JPEG 颜色

标签 java jpeg javax.imageio

当我阅读某些 JPG 文件时,颜色变平了。这是一个简单的示例,它读取一个 jpg 并将相同的图像写入另一个文件。

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class JPegReadTest {
    public static void main(String[] args) {
        if (args.length == 2) {
            try {
                BufferedImage src = ImageIO.read(new File(args[0]));
                ImageIO.write(src, "jpg", new File(args[1]));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.err.println("Usage: java JPegReadTest src dest");
        }
    }
}

如果您尝试使用例如 http://www.flickr.com/photos/visualpanic/233508614/sizes/l/ ,目标图像的颜色与源文件不同。这是为什么?如何解决?

还尝试将图像保存为 png,但其中的颜色也很乏味(因此假设颜色信息未正确读取)。

最佳答案

可能有几个原因。

  1. JPEG 颜色数据通常存储为 YCrCb 而不是 RGB,尽管转换几乎不会引起注意。
  2. JPEG 通常有一个嵌入的颜色配置文件,但许多应用程序不理解这一点而只是忽略它(在这种情况下,您的输出文件可能会丢失颜色配置文件)。
  3. Gamma 值在 Java 处理后可能会被重置或丢失。

我实际上并没有尝试你的例子......你能把文件前后都贴出来吗?如果不能实际检查结果文件,就很难判断这些额外数据是否存在。

编辑:是的,很明显您的原始图像和转换后的图像具有不同的颜色配置文件。 Java 剥离了原始的颜色配置文件并使用通用的 sRGB 代替。在使用 Firefox 和各种程序的 Windows 上,它们在我们看来是一样的,因为这些程序在渲染器时不使用颜色配置文件。但是,在您的 Mac 上,Mac 实际上支持这些颜色配置文件(提示关于 Mac 的图形等争论),因此它们呈现不同。我手边没有 Mac,但我怀疑如果你在任何平台上的 Photoshop 中打开这些文件,你都会看到不同之处。

关于java - 为什么 Java ImageIO 会展平 JPEG 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271658/

相关文章:

java - 如何保持 gradle 依赖项 Intent 特定

java - 如何在 Android Q 中检测拨出电话号码

WPF - 以 jpeg 格式保存 Canvas 的黑色背景

grails - 如何将 TIFF ImageReader 添加到 Grails 中注册的那些

java - 在 Java 中通过套接字发送图像的有效方法

Java将文本放置到图像上不显示

java - 实例化SharedViewModel

java - 为什么我们要检查 n.parent == null?

c++ - 如何在有和没有 std::vector 的情况下正确使用 jpeg_mem_dest

c++ - 不能在 dlib cpp 文件中包含 JPEG_SUPPORT header