为什么Java ImageIO会使JPEG颜色变平

ket*_*rin 10 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

还尝试将图像保存为png,但颜色也很淡(所以假设颜色信息无法正确读取).

erj*_*ang 10

这可能有几个原因.

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

我实际上没有尝试你的例子......你能不能在文件之前和之后发帖?如果没有实际能够检查结果文件,很难判断这些额外的数据是否存在.

编辑:是的,很明显您的原始图像和转换后的图像具有不同的颜色配置文件.Java剥离了原始的颜色配置文件,而是使用了通用的sRGB.它们在Windows上使用Firefox和各种程序看起来一样,因为这些程序在渲染器时不使用颜色配置文件.但是,在Mac上,Mac实际上支持这些颜色配置文件(在Mac上提供图形等方面的争论),因此它们呈现的方式不同.我没有Mac方便,但我怀疑如果你在任何平台上用Photoshop打开文件,你会看到差异.