コメントで述べたように、あなたのAdobeRGB1998のICCプロファイルに関する特別な何かがありますしない限り、あなたが持っているコードは、働いている必要があります...
以下のコードがsRGBからAdobeRGB1998プロファイルに画像を変換し、私の作品。結果として得られるTIFFファイルには、正しいICCプロファイルがあり、アルファチャンネルはそのままです(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を使用してください)。元の画像はタイル張りされていないので、あまり心配はありません。
[Javaでiccカラープロファイルを設定して色空間を変更する方法](http://stackoverflow.com/questions/380678/how-to-set-icc-color-profile-in-java-and-変更色空間) –
私はそれを試み、それは動作しませんでした。どちらが不完全であるか、Tiffsで動作しないためです。 – jonD02
@ jonD02 TwelveMonkeysの 'TIFFImageWriter'は、プロファイルが(ColorSpace.isCS_sRGB()のように)sRGBプロファイルでない限り、ICCプロファイルを使用して書き出します。これは、デフォルトのTIFFカラースペースがsRGBであることを前提としていますが、これは正しい仮定ではない可能性があります。しかしそれはAdobeRGB1998のために働くはずです。あなたのサンプルコードから 'sandal.tif'ファイルをリンクできますか?もしそうなら、私は問題を再現し、解決策を考えようとします。 – haraldK