スキップしてメイン コンテンツに移動

JavaでCMYK Color SpaceのJPEGを読み込む

Read CMYK JPEG Image

CMYKのJPEG画像をJavaで読む方法ではまったので、Google先生で色々調べて見ました。
Problem reading JPEG image using ImageIO.read(File file)によるとImageIOで読めないJPEGファイルはほとんどCMYK Color Spaceの画像のようです。
私の場合もまず読めないJPEGがあることでCMYKのJPEGであることに気がつきました。

という訳で、CMYKのJPEGをどうやって読み込めばいいのということで色々調べてみました。
以下のstackoverflowによると、基本的にまずCMYKのColor Spaceで読み込んで、それからRGB系のColor Spaceに変換することでJavaでも読み込みができるようです。
ただし、このCMYKのColor Spaceインスタンスを作るのが結構面倒です。
前述のstackoverflowによると、以下の方法があるようです。
  1. CMYKのColorSpaceをSanselanライブラリを使って画像から抜き出す
  2. ICC_Profile iccProfile = Sanselan.getICCProfile(new File("filename.jpg"));
    ColorSpace cs = new ICC_ColorSpace(iccProfile);
    
  3. 自分でCMYKColorSpaceクラスを定義して、インスタンス化する
  4. iccプロファイルから、ColorSpaceインスタンスを生成する。ただしiccプロファイルはどこかから自前に用意する必要があります。
  5. ICC_Profile iccProfileCYMK = ICC_Profile.getInstance(new FileInputStream("path_to_cmyk_icc_profile"));
    ColorSpace sRGBColorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
    
いろいろ試した結果、結局私は、3の「iccプロファイルから、ColorSpaceインスタンスを生成する」が一番まともに動いたので、その方法を採用しました。
iccプロファイルは、eci.orgからECI_Offset_2009.zipをダウンロードしてISOcoated_v2_300_eci.iccを選んで使いました。(正直、iccプロファイルについては、あまり詳しくないので、どれを使うべきかはよくわかりません。。。)

ソースコードは、stackoverflowのこちらの回答を参考にしてください。
私の場合、画像の明度が若干変わってしまいましたが、少なくとも画像を読み込んでファイルに保存できるようになりました。

Javaの画像ライブラリ



Javaの画像処理についての解説

コメント