java - 以 jpeg 格式保存色彩空间

标签 java jpeg javax.imageio color-space

我有一个 servlet 可以转换和缓存较小版本的照片。它是使用 java.awt.image + javax.imageio 和第三方重采样过滤器实现的。原件均使用 sRGB 颜色配置文件上传。当我对它们重新采样并再次保存时,它们仍然处于 sRGB 中,但这没有记录在保存的文件中。

如何确保此信息保存在文件中?

如果您想知道它有什么不同,没有配置文件的图像在我的屏幕(Safari + OSX + 校准屏幕)上比具有正确的 sRGB 配置文件时更饱和。此外,我确定这是缺少的配置文件信息,而不是重采样算法。

最佳答案

原来包含一个 EXIF 标签 ColorSpace=1 就足够了,告诉它应该作为 sRGB 处理。使用 Apache Commons Sanselan 成功地做到了这一点。不幸的是,这个库并不完整,所以它只能在文件创建后用于修改 EXIF。

相关代码,基于Sanselan例子:

public void addExifMetadata(File jpegImageFile, File dst)
            throws IOException, ImageReadException, ImageWriteException {
        OutputStream os = null;
        try {
            TiffOutputSet outputSet = new TiffOutputSet();

            TiffOutputField colorspace = TiffOutputField.create(
                        TiffConstants.EXIF_TAG_COLOR_SPACE, outputSet.byteOrder, new Integer(1));
            TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory();
            exifDirectory.add(colorspace);

            os = new FileOutputStream(dst);
            os = new BufferedOutputStream(os);
            new ExifRewriter().updateExifMetadataLossless(jpegImageFile, os, outputSet);

            os.close();
            os = null;
        } finally  {
            if (os != null)
                try {
                    os.close();
                } catch (IOException e) {

                }
        }
    }

关于java - 以 jpeg 格式保存色彩空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5586671/

相关文章:

ios - 我可以在 jpeg 中使用(一些)iOS 启动图像,而不是在 xcode5 中使用 png 吗?

java - 如何从通过串行端口接收的数据创建 BufferedImage

java - imageIO 打开 .HDR 文件

java - gson 抛出 MalformedJsonException

java - 如何将 java 8 映射、过滤器和流转换为 scala?

java - 是否可以在不引用表单的情况下以编程方式将文件(图像)上传到 BlobStore?

OpenCV - 图像压缩的可能选项

java - xpath 获取表内的行

image-processing - 是否有任何高质量的程序化解决方案可以将具有不透明背景的 jpeg 转换为具有透明背景的 png?

java - jpg 没有被 ImageIO.write() 覆盖