2008年12月4日木曜日

GroovyからJPEG画像をRGB→CMYK変換

imageio を使った jpeg の rgb, cmyk 相互変換 - 夜の Discovery
Java Programming [Archive] - HELP!!! URGENT!!!! convert a jpg CMYK to jpg RGB
上記ページのJava→Groovy翻訳に挑戦。自分の力ではこれ以上コード削れなかった…。

import java.awt.image.*;
import java.awt.color.*;
import java.awt.event.*;
import java.awt.*;
import com.sun.image.codec.jpeg.*;

String USAGE = "groovy CMYKSave <cmykProfile> <rgbJPEGFile> <cmykJPEGFile> <invert=yes|no>"

//引数が4つ未満ならUSAGEを表示して終了
if(args.length<4){
println(USAGE)
System.exit(0)
}

//引数それぞれの割当て
String cmykProfile = args[0]
String rgbJPEGFile = args[1]
String cmykJPEGFile = args[2]
boolean invert = "true".equalsIgnoreCase(args[3])

//元イメージを読み込む
def decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(rgbJPEGFile))
def rgbImage = decoder.decodeAsBufferedImage();

//CMYKプロファイルからCMYKカラースペースを作成
def p = ICC_Profile.getInstance(new FileInputStream(cmykProfile))
def cmykCS = new ICC_ColorSpace(p);

def out = new FileOutputStream(cmykJPEGFile)

//RGBイメージからCMYKへのコンバート
def rgbCS = rgbImage.getColorModel().getColorSpace()
def rgbToCmyk = new ColorConvertOp(rgbCS, cmykCS, null)

//変換先CMYKイメージのカラーモデル作成
def cmykModel = new ComponentColorModel(cmykCS,[8, 8, 8, 8] as int[],
false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE)
def cmykRaster =
cmykModel.createCompatibleWritableRaster(rgbImage.getWidth(),rgbImage.getHeight())

//ここでCMYKにコンバートする
rgbToCmyk.filter(rgbImage.getRaster(), cmykRaster)

//trueなら階調反転
if(invert){
println("CMYKの階調を反転します")
def swap = new byte[256]
for(i in 0..<swap.length){
swap[i] = (byte)(255-i)
}
def lookup = new ByteLookupTable(0, [swap, swap, swap, swap] as byte[][] )
def luop = new LookupOp(lookup, null)
cmykRaster = luop.filter(cmykRaster, cmykRaster.createCompatibleWritableRaster())
}

//最後にCMYK画像を保存する
def encoder = JPEGCodec.createJPEGEncoder(out)
def param = encoder.getDefaultJPEGEncodeParam(cmykRaster, JPEGDecodeParam.COLOR_ID_CMYK)
param.setQuality(1, false)
encoder.encode(cmykRaster, param)
out.close()
println("イメージ${cmykJPEGFile}を保存しました。")

動作確認は
$ groovy CMYKSave.groovy JapanColor2001Coated.icc test.jpg test_out.jpg true

って感じです。

0 件のコメント: