夜の Discovery このページをアンテナに追加 RSSフィード

セイバーメトリクス対応!野球の成績・チーム・試合管理の決定版!『ガチャスポ ベースボール』

2007-12-09

imageio を使った jpeg の rgb, cmyk 相互変換

  • rgbcmyk
    • 以下のサイトの通り。
    • すばらしい!

Java Programming [Archive] - HELP!!! URGENT!!!! convert a jpg CMYK to jpg RGB

http://forum.java.sun.com/thread.jspa?threadID=527311&messageID=2531272


  • cmykrgb
    • 公開用にシンプルにしたのでエラー処理とかは適当。CMYK 画像以外だと例外飛びます。
    • commons-io を使って閉じ処理。
    • invert のところで色を反転。
    • 色合いが少し暗めになってしまっている。(どこかおかしい?変換誤差?)
File inputFile = new File("c:/input.jpg");
File outputFile = new File("c:/output.jpg");

FileInputStream in = null;
BufferedImage jpgImage = null;
try {
  try {
    in = new FileInputStream(inputFile);
    JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in); 
    jpgImage = decoder.decodeAsBufferedImage();
    jpgImage = cmykToSRGB(jpgImage);
  } finally {
    IOUtils.closeQuietly(in);
  }
  OutputStream os = null;
  try {
    os = new FileOutputStream(outputFile);
    // invert
    if (true) {
      int w = jpgImage.getWidth();
      int h = jpgImage.getHeight();
      for (int i=0;i<w;i++) {
        for (int j=0;j<h;j++) {
          int rgb = jpgImage.getRGB(i, j);
          int r = (rgb & 0xff0000) >> 16;
          int g = (rgb & 0x00ff00) >> 8;
          int b = (rgb & 0x0000ff);
          rgb = ((Math.abs(r - 255) << 16) + (Math.abs(g - 255) << 8) + (Math.abs(b - 255)));
          jpgImage.setRGB(i, j, rgb);
        }
      }
    }
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
    JPEGEncodeParam params = encoder.getDefaultJPEGEncodeParam(jpgImage);
    params.setQuality(1.0f, false);
    encoder.encode(jpgImage, params);
  } finally {
    IOUtils.closeQuietly(os);
  }
} catch (Exception e) {
  e.printStackTrace();
}

public BufferedImage cmykToSRGB(BufferedImage readImage) throws IOException {
  ICC_Profile p = ICC_Profile.getInstance(ResourceUtils.getString("c:/ISOcoated_v2_300_eci.icc"));
  ColorSpace cmykCS = new ICC_ColorSpace(p);
  BufferedImage rgbImage = new BufferedImage(readImage.getWidth(), readImage.getHeight(), BufferedImage.TYPE_INT_RGB);
  ColorSpace rgbCS = rgbImage.getColorModel().getColorSpace();
  ColorConvertOp cmykToRgb = new ColorConvertOp(cmykCS, rgbCS, null);
  cmykToRgb.filter(readImage, rgbImage);
  return rgbImage;
}

ICC プロファイル(ISOcoated_v2_300_eci.iccとか)のダウンロードは以下のサイトから。

ECI - Downloads

http://www.eci.org/eci/en/060_downloads.php

Adobe ICCプロファイル - ICCプロファイル for Windows - Downloads

http://www.adobe.com/jp/support/downloads/1330.html


間違いなどあればご指摘お願いします。


参考

Java 2D API 6 -

http://java.sun.com/j2se/1.3/ja/docs/ja/guide/2d/spec/j2d-color.fm2.html

「CMYK」と「RGB」

http://www.bokuden.or.jp/~orikami/color/color02.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kusakari/20071209/1197131593