近似式による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

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

Leave a Reply