2016-10-01 11 views
1

Webを高低に検索したため、JavaでTiff ImageにsRGBまたはAbobe(1998)カラープロファイルを追加する方法の解決策が見つかりません。 。 jpgとpngのいくつかの例がありますが、tiffには適用されません。私はCommons Imagingとjava.awtでそれをやろうとしていましたが、運がまったくありません。出来ますか?JavaでTiff Image Color Profile(sRGBまたはAdobe 1998)を追加

おかげ

更新:カラープロファイルが適用されますが、いさかいがあるさ

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")); 

を私はTwelveMonkeys ImageIOに-TIFFライブラリを使用して、いくつかの進歩と、次のコードを作りました平坦化され、アルファが削除されました。アルファチャンネルはどのように保存できますか?

+0

[Javaでiccカラープロファイルを設定して色空間を変更する方法](http://stackoverflow.com/questions/380678/how-to-set-icc-color-profile-in-java-and-変更色空間) –

+0

私はそれを試み、それは動作しませんでした。どちらが不完全であるか、Tiffsで動作しないためです。 – jonD02

+0

@ jonD02 TwelveMonkeysの 'TIFFImageWriter'は、プロファイルが(ColorSpace.isCS_sRGB()のように)sRGBプロファイルでない限り、ICCプロファイルを使用して書き出します。これは、デフォルトのTIFFカラースペースがsRGBであることを前提としていますが、これは正しい仮定ではない可能性があります。しかしそれはAdobeRGB1998のために働くはずです。あなたのサンプルコードから 'sandal.tif'ファイルをリンクできますか?もしそうなら、私は問題を再現し、解決策を考えようとします。 – haraldK

答えて

0

コメントで述べたように、あなたの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を使用してください)。元の画像はタイル張りされていないので、あまり心配はありません。

+0

ありがとうございます!これはカラープロファイルでは機能しますが、アプリの別の部分で問題が発生しています。TIFは、後で次のコードを使用してPNGを作成するために使用されます。 – jonD02

+0

'File 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"、新しいファイル(pngFile)); プライベート静的BufferedImage resizeImage(BufferedImage originalImage、int型、int IMG_WIDTH、int IMG_HEIGHT){ BufferedImage resizedImage =新しいBufferedImage(IMG_WIDTH、IMG_HEIGHT、タイプ); Graphics2D g = resizedImage.createGraphics(); g.drawImage(originalImage、0、0、IMG_WIDTH、IMG_HEIGHT、null); g.dispose(); 返されるresizedImage; – jonD02

+0

tifをカラープロファイルで使用した結果のpngファイル:https://drive.google.com/open?id=0B8FrShLAYpOEcDllb3BUYTNfTlE PhotoshopでTIFを同じ方法で更新した場合、これは発生しません。 https:/ /drive.google.com/open?id=0B8FrShLAYpOEUjNLQVBCVVJCQjA – jonD02

関連する問題