結論から言うと失敗作というか、最小値と最大とのみを考慮して作られた式です。
はっきりいって使い物になりませんが、フリーソフトではつかっちゃっているようです。
動作確認用に作ったものなので、細かいエラーチェックは抜きです。
#===============================================================================
# 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;
}
結局、色を絞って変換テーブルを自作することになりましたけどね。