近似式によるRGB→CMYK/CMYK→RGB変換
AppleScriptでRGBの色データをCMYKの色データに変換する手段といえば、Color Sync Scirpingを用いるのが常套手段だったのですが、これがMac OS X 10.6で廃止になりました(残念!)。
・OS X 10.7, LionのRelease Noteに書かれていない変更点
http://piyocast.com/as/archives/1751
ほかに、色データの変換を行う手段といえば、安直にPhotoshopに計算してもらうというものもあります。こちらは、現在でも(Photoshopが入っている環境であれば)利用できます。
・与えられたテキストをPhotoshopでRGBデータと評価してCMYK値を返す
http://piyocast.com/as/archives/1898
ほかには、AppleScriptObjCが使えれば、NSColorのgenericCMYKcolorSpaceを用いて変換することも可能です。genericなCMYKcolorSpaceだけでなく、出力デバイス名を指定して出力特性を反映させて変換を行うことも可能です(genericしか試してないけど)。
……で、これらの手段が使えない場合にどうするかといえば、RGB→CMYK/CMYK→RGBの変換を行う「近似式」があるため、それを使うのが一般的です。
・ISP imaging-developers-色変換式集 - CMYK
http://image-d.isp.jp/commentary/color_cformula/CMYK.html
この近似式を用いた(Objective-Cで書かれた)プログラムの処理結果が思わしくないということだったので、AppleScriptで近似式を用いて相互変換の処理を書いてみました。
RGB→CMYK変換では、黒に近い色(というか黒)を与えると0による除算が発生したり、マイナスの値になったりするケースが見られたため、try〜end tryでエラーをキャッチしたりするなど、地道な補正を加えています。
本Scriptでは、choose colorコマンドで指定した色(RGB)を一度CMYKに変換し、変換したCMYK値を再度RGB値に変換してchoose colorコマンドで色プレビューを行っています。
RGB→CMYKの変換時に発生する一種の「くすみ」がなく、見たまんまそのまま変換されてしまうので、分る人が見るとウソだと分るのですが、単に変換したいだけという場合には割と使えるという感触です。
スクリプト名:指定色をRGB→CMYK→RGB変換プレビュー |
–色選択 set aCol to choose color set {rNum, gNum, bNum} to aCol set rNum to rNum div 255 set gNum to gNum div 255 set bNum to bNum div 255 –RGB→CMYK変換 set {cNum, mNum, yNum, kNum} to approximateRGBtoCMYKconvert(rNum, gNum, bNum) of me –CMYK→RGB変換 set {rNum2, gNum2, bNum2} to approximateCMYKtoRGBconvert(cNum, mNum, yNum, kNum) of me set rNum2 to 65535 * rNum2 set gNum2 to 65535 * gNum2 set bNum2 to 65535 * bNum2 –色プレビュー choose color default color {rNum2, gNum2, bNum2} –近似式ベースのRGB→CMYK変換 –参照資料: –http://image-d.isp.jp/commentary/color_cformula/CMYK.html on approximateRGBtoCMYKconvert(r, g, b) set rNum to r / 255 set gNum to g / 255 set bNum to b / 255 set nList to {1 - rNum, 1 - gNum, 1 - bNum} set kNum to minimumFromList(nList) of me –kNum(Black)がマイナスになるケースがあるため、値を補正 if kNum < 0 then set kNum to 0 –0による除算が発生した場合の算術エラーに対処 try set cNum to (1 - rNum - kNum) / (1 - kNum) on error set cNum to 0 end try –0による除算が発生した場合の算術エラーに対処 try set mNum to (1 - gNum - kNum) / (1 - kNum) on error set mNum to 0 end try –0による除算が発生した場合の算術エラーに対処 try set yNum to (1 - bNum - kNum) / (1 - kNum) on error set yNum to 0 end try –C/M/Yがマイナスになるケースがあるため、値を補正 if cNum < 0 then set cNum to 0 if mNum < 0 then set mNum to 0 if yNum < 0 then set yNum to 0 return {cNum, mNum, yNum, kNum} end approximateRGBtoCMYKconvert –近似式ベースのCMYK→RGB変換 –参照資料: –http://image-d.isp.jp/commentary/color_cformula/CMYK.html on approximateCMYKtoRGBconvert(c, m, y, k) set rNum to 1 - (minimumFromList({1, c * (1 - k) + k})) set gNum to 1 - (minimumFromList({1, m * (1 - k) + k})) set bNum to 1 - (minimumFromList({1, y * (1 - k) + k})) return {rNum, gNum, bNum} end approximateCMYKtoRGBconvert –最小値を取得する on minimumFromList(nList) script o property nl : nList end script set min to item 1 of o’s nl repeat with i from 2 to (count nList) set n to item i of o’s nl if n < min then set min to n end repeat return min end minimumFromList |