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でも読み込みができるようです。
- Pure Java alternative to JAI ImageIO for detecting CMYK images
- How do I convert images between CMYK and RGB in ColdFusion (Java)?
- How to convert from CMYK to RGB in Java correctly?
ただし、このCMYKのColor Spaceインスタンスを作るのが結構面倒です。
前述のstackoverflowによると、以下の方法があるようです。
- CMYKのColorSpaceをSanselanライブラリを使って画像から抜き出す
- 自分でCMYKColorSpaceクラスを定義して、インスタンス化する
- iccプロファイルから、ColorSpaceインスタンスを生成する。ただしiccプロファイルはどこかから自前に用意する必要があります。
ICC_Profile iccProfile = Sanselan.getICCProfile(new File("filename.jpg")); ColorSpace cs = new ICC_ColorSpace(iccProfile);
ICC_Profile iccProfileCYMK = ICC_Profile.getInstance(new FileInputStream("path_to_cmyk_icc_profile")); ColorSpace sRGBColorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
iccプロファイルは、eci.orgからECI_Offset_2009.zipをダウンロードしてISOcoated_v2_300_eci.iccを選んで使いました。(正直、iccプロファイルについては、あまり詳しくないので、どれを使うべきかはよくわかりません。。。)
ソースコードは、stackoverflowのこちらの回答を参考にしてください。
私の場合、画像の明度が若干変わってしまいましたが、少なくとも画像を読み込んでファイルに保存できるようになりました。
Javaの画像ライブラリ
- Image4J: JavaでBitmapを読み書きしたいならこのライブラリが便利です。
- Sanselan: a Pure-Java Image Library
- Java Advanced Imaging (JAI) API: 以前tiff画像を読み込むために使いました。
- pngj: pngファイルの読み込みで威力を発揮します!
- ImageJ: Javaベースの画像処理ソフトウェア
Javaの画像処理についての解説
- 画像ファイルのロード: 各種APIの性能等が詳しく比較されています。是非一読することをお勧めします!
コメント