10

当我阅读某些 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,但其中的颜色也很平淡(因此假设颜色信息未正确读取)。

4

5 回答 5

10

可能有几个原因。

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

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

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

于 2009-08-13T12:44:50.383 回答
2

也许您的源图像具有比 sRGB(如 Adob​​e RGB)更宽的色域分配的颜色配置文件,并且您的加载/保存周期没有保留颜色空间信息?如果没有颜色配置文件,您的查看器将假定为 sRGB,压缩色域将使一切看起来“废话”。如果你有 exiftool,

exiftool -ProfileDescription filename.jpg

是一种快速验证源图像和输出图像的颜色配置文件的方法。

于 2009-08-13T14:15:33.950 回答
0

jpeg 是有损格式。读入时,java 将其存储为类似于 BMP 的原始格式。然后它再次被写出导致数据丢失。此外,在使用 GIMP 之类的东西时,对质量没有太多控制。

也许考虑使用其他 API,如Image Magick,让您更好地控制质量。

于 2009-08-13T12:45:31.430 回答
0

JPEG是一种有损格式。

这意味着如果您打开一个文件并再次保存它,您将丢失一些信息,除非您采取非常具体的步骤不丢失任何信息(在这种情况下,可能的操作非常有限)。

此外ImageIO.write(),可能会使用一些默认质量设置来保存 JPEG 文件,这可能低于原始质量,这会导致额外的质量损失。

尝试保存为 PNG 文件,您会发现它看起来与源文件相同。

于 2009-08-13T12:47:23.840 回答
0

这是在 ImageIO 接口上扩展的源代码链接 - 您可以在编写图像时更改质量和压缩参数.... http://www.universalwebservices.net/web-programming-resources/java/adjust- jpeg-image-compression-quality-when-saving-images-in-java

于 2013-01-18T00:29:44.493 回答