結論から言うと失敗作というか、最小値と最大とのみを考慮して作られた式です。
はっきりいって使い物になりませんが、フリーソフトではつかっちゃっているようです。
動作確認用に作ったものなので、細かいエラーチェックは抜きです。
#=============================================================================== # RGB => CMYK(cmyが同じ値の場合kに割り振る) #------------------------------------------------------------------------------- sub rgb2cmyk { my $rgb = shift; $rgb =~ /^#?(..)(..)(..)$/; my %color = ( 'r' => hex( $1 ), 'g' => hex( $2 ), 'b' => hex( $3 ), ); $color{'c'} = 1 - ( $color{'r'} / 255 ); $color{'m'} = 1 - ( $color{'g'} / 255 ); $color{'y'} = 1 - ( $color{'b'} / 255 ); $color{'k'} = 0; if( $color{'c'} == $color{'m'} || $color{'m'} == $color{'k'} ){ $color{'k'} = $color{'c'}; $color{'c'} = $color{'m'} = $color{'y'} = 0; } return %color; }
結局、色を絞って変換テーブルを自作することになりましたけどね。