我搜索了网页的高低,我找不到一个解决方案,如何添加一个sRGB或Abobe (1998年)颜色配置文件到一个蒂夫图像与Java。对于jpgs和pngs有一些例子,但它们不适用于tiffs。我一直试着用公用成像和java.awt来做这件事,但没有任何运气。有可能吗?
谢谢
更新:
我在使用TwelveMonkeys imageio库和以下代码方面取得了一些进展:
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通道?
发布于 2016-10-10 11:27:54
正如注释中提到的,您应该使用的代码,除非您的AdobeRGB1998 ICC配置文件有什么特别之处.
下面的代码适用于我,将图像从sRGB转换为AdobeRGB1998配置文件。生成的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压缩和300 bit ),不幸的是,它更冗长:
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元数据仍然被从输出中删除,我认为这是一个bug)。
作者目前不支持平铺,但将来它可能由writeParam控制(使用标准API来控制)。你原来的形象不是平铺的,所以我想这不是什么值得关注的问题。
https://stackoverflow.com/questions/39802563
复制相似问题