【问题标题】:Add Tiff Image Color Profile (sRGB or Adobe 1998) with Java使用 Java 添加 Tiff 图像颜色配置文件(sRGB 或 Adob​​e 1998)
【发布时间】:2016-10-01 02:54:23
【问题描述】:

我在网上到处搜索,但找不到有关如何使用 Java 将 sRGB 或 Abobe (1998) 颜色配置文件添加到 Tiff 图像的解决方案。有一些用于 jpg 和 png 的示例,但它们不适用于 tiff。我一直在尝试使用 Commons Imaging 和 java.awt 来做这件事,但没有任何运气。有可能吗?

谢谢

更新:

我使用 TwelveMonkeys imageio-tiff 库和以下代码取得了一些进展:

File file = new File("/Users/user/Desktop/demo/sandal.tif");
BufferedImage image = ImageIO.read(file);

ICC_Profile ip = ICC_Profile.getInstance("/Users/user/Documents/icc/AdobeRGB1998.icc");
ICC_ColorSpace ics = new ICC_ColorSpace( ip );
ColorConvertOp cco = new ColorConvertOp( ics, null );
BufferedImage result = cco.filter(image, null);

ImageIO.write(result, "TIFF", new File("/Users/user/Desktop/demo/sandal2.tif"));

应用了颜色配置文件,但 tiff 被展平并且 alpha 被移除。 alpha通道如何保存?

【问题讨论】:

  • 我试过了,但没有用。要么是因为它不完整,要么它不适用于 Tiffs。
  • @jonD02 目前,TwelveMonkeys TIFFImageWriter 将写入正在使用的 ICC 配置文件,除非该配置文件是 sRGB 配置文件(如 ColorSpace.isCS_sRGB())。这假设默认的 TIFF 颜色空间是 sRGB,这可能不是一个正确的假设。但它应该适用于 Adob​​eRGB1998。您可以从示例代码中链接sandal.tif 文件吗?如果是这样,我将尝试重现该问题并提出解决方案。
  • PS:刚刚尝试了您的代码(稍作修改,因为我没有您的文件,显然),我得到了一个很好的 TIFF 文件,其中保留了 alpha 并嵌入了 ICC 配置文件。在 Windows 上使用 bot Java 1.8 和在 macOS 上使用 Java 1.7,最新的 TwelveMonkeys 由 master 构建。在 ColorSync 实用程序中验证。
  • @haraldK 感谢您的回复!我很喜欢你的图书馆。我不确定如何使用 TiffImageWriter,你能提供一个演示吗?这是文件的链接:drive.google.com/file/d/0B8FrShLAYpOEX25vU2NKM2xfNTA/…

标签: java color-profile twelvemonkeys


【解决方案1】:

正如 cmets 中提到的,您的代码应该可以工作,除非您的 Adob​​eRGB1998 ICC 配置文件有什么特别之处...

以下代码适用于我,将图像从 sRGB 转换为 Adob​​eRGB1998 配置文件。生成的 TIFF 文件具有正确的 ICC 配置文件并包含完整的 Alpha 通道 (258/BitsPerSample: [8, 8, 8, 8], 277/SamplesPerPixels: 4, 34675/ICCProfile: [...])。我能看到的唯一小问题是压缩从 LZW 更改为无压缩,DPI 从 300 更改为 72(+ XMP 元数据丢失)。

BufferedImage image = ImageIO.read(new File("C:\\Downloads\\sandal.tif"));

ICC_ColorSpace ics = (ICC_ColorSpace) ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998);
ColorConvertOp cco = new ColorConvertOp(ics, null);
BufferedImage result = cco.filter(image, null);

File tempFile = File.createTempFile("test-", ".tif");
System.out.println("tempFile: " + tempFile); // Just to know where to look
ImageIO.write(result, "TIFF", tempFile);

如您所见,这里唯一真正的区别是如何获得 ICC 配置文件/色彩空间。

如果您想保留元数据和/或控制压缩,这也是可能的。下面的代码基本相同(但保留了 LZW 压缩和 300dpi),不幸的是它有点冗长:

try (ImageInputStream input = ImageIO.createImageInputStream(new File("C:\\Downloads\\sandal.tif"))) {
    ImageReader reader = ImageIO.getImageReaders(input).next();
    reader.setInput(input);
    IIOImage imageAndMeta = reader.readAll(0, reader.getDefaultReadParam());
    reader.dispose();

    ICC_ColorSpace ics = (ICC_ColorSpace) ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998);
    ColorConvertOp cco = new ColorConvertOp(ics, null);
    BufferedImage result = cco.filter((BufferedImage) imageAndMeta.getRenderedImage(), null);

    imageAndMeta.setRenderedImage(result);

    File tempFile = File.createTempFile("test-", ".tif");
    System.err.println("tempFile: " + tempFile);

    ImageWriter tiffWriter = ImageIO.getImageWritersByFormatName("TIFF").next();
    try (ImageOutputStream stream = ImageIO.createImageOutputStream(tempFile)) {
        tiffWriter.setOutput(stream);

        ImageWriteParam writeParam = tiffWriter.getDefaultWriteParam();

        // If you want a specific compression, uncommment these lines
        // The default setting is to copy from metadata
//        writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        // Allowed compression type values are: 
        // "None", "CCITT RLE", "CCITT T.4", "CCITT T.6","LZW", "JPEG", "ZLib", "PackBits" and "Deflate"
//        writeParam.setCompressionType("PackBits");

        tiffWriter.write(null, imageAndMeta, writeParam);
    }

    tiffWriter.dispose();
}

(由于某种原因,XMP 元数据仍然从输出中删除,我认为这是一个错误)。

编写器当前不支持平铺,但将来可能由writeParam 控制(使用标准API 来控制)。您的原始图像没有平铺,所以我想这不是问题。

【讨论】:

  • 谢谢!这适用于颜色配置文件,但它给我的应用程序的另一部分带来了问题。 TIF 稍后用于创建 PNG,使用以下代码:
  • '文件 file = new File(tiffFile); BufferedImage image = ImageIO.read(file); BufferedImage resizeImagePng = resizeImage(image, BufferedImage.TYPE_INT_ARGB, image.getWidth() / 4, image.getHeight() / 4); ImageIO.write(resizeImagePng, "PNG", new File(pngFile)); private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) { BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose();返回调整大小的图像;
  • 使用带有颜色配置文件的 tif 生成的 png 文件:drive.google.com/open?id=0B8FrShLAYpOEcDllb3BUYTNfTlE 当我在 Photoshop 中以相同的方式更新 Tif 时不会发生这种情况:drive.google.com/open?id=0B8FrShLAYpOEUjNLQVBCVVJCQjA
  • 我建议您为此提出一个新问题,因为在 cmets 中查找只是为了澄清当前的问题/答案。 :-) 我还是会尽力帮忙的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多