1

編集:助けてくれたみんなに感謝しますが、問題はまだ解決していません. では、クランプを必要とせずに彩度を編集するためのより良い式はありますか? 非線形式は機能する可能性がありますが、正確な適切な式はわかりません。どうも

ipiccy.com と同様に、色相/彩度/明度を増減できる写真編集システムを開発しようとしています。HSI<->RGB 変換を使用しています。まず、各ピクセルが RGB から HSI に変換されます。次に、ユーザーは追加したい彩度の量を指定します。3 番目に、システムは、最初のステップで変換された元の彩度値にユーザー指定の値を追加し、これらの HSI 値を RGB に変換します。私の問題は、新しい HSI 値を RGB に戻すと、一部の RGB 値が 255 を超えることです。そのため、色が正しく表示されません。

私は何日も読んで試してみましたが、うまくいきませんでした。誰でもそれを解決する方法を知っていますか? 読んだり解決したりするための手がかりやリンクは大歓迎です。どうもありがとう。

4

2 に答える 2

1

削除する必要はありません。コードの形式は確かに悪いですが、提供していただきありがとうございます。

このコードは、私と同じ問題に取り組んでいる他の人から送られてきました。私がやったのはコードに実装することだけだったので、悪い答えを許してください。

コードは次のとおりです(3つの機能)

gimmeHSL()RGBからHSLに変換します

中: R, G, B <=> {0, 255}, {0, 255}, {0, 255}

出: 横、横、左 <=> {0, 360}, {0, 1}, {0, 1}

gimmeRGB()RGBからHSLに変換します

で: H、S、L <=> {0, 360}, {0, 1}, {0, 1}

OUT: R, G, B <=> {0, 255}, {0, 255}, {0, 255}

magic_kristo()、 何をするものかわかりませんが、他の2人で使用されているようです。

使用例はこちら

print_r(gimmeRGB(gimmeHSL(200,153,148)));

注:これが役に立ったとしても、賛成しないでください。とても気分が悪くなります。それを使用して、機能する場合はコメントを残してください。

function gimmeHSL($zk0,$ns1=null,$wo2=null){if(is_array($zk0)&&sizeof($zk0)==3)list($tm3,$ns1,$wo2)=$zk0;
else $tm3=$zk0;$ck4=min($tm3,$ns1,$wo2);$pw5=max($tm3,$ns1,$wo2);$qe6=$pw5-$ck4;
$up7=($pw5+$ck4)/510;if(0 ==$qe6){$li8=0;$wu9=0;}else{if(0.5>$up7){$wu9=$qe6/($pw5+$ck4);}else{$wu9=$qe6/(510-$pw5-$ck4);}
if($pw5==$tm3){$li8=($ns1-$wo2)/(6.0*$qe6);}
else if($pw5==$hd10){$li8=1/3+($wo2-$tm3)/(6.0*$qe6);}else{$li8=2/3+($tm3-$ns1)/(6.0*$qe6);}
if(0>$li8)$li8+=1;if(1<$li8)$li8-=1;}$li8=round($li8*360);return array($li8,$wu9,$up7);}
function gimmeRGB($np11,$vs12=null,$pp13=null){if(is_array($np11)&&sizeof($np11)==3)list($zg14,$vs12,$pp13)=$np11;
else $zg14=$np11;if($vs12==0){$tm3=$ns1=$wo2=round($pp13*255);}else{if($pp13<=0.5){$oo15=$pp13*($vs12+1);}
else{$oo15=$pp13+$vs12-$pp13*$vs12;}$qw16=$pp13*2-$oo15;$qk17=$zg14/360;$tm3=magic_kristo($qw16,$oo15,$qk17+1/3);
$ns1=magic_kristo($qw16,$oo15,$qk17);$wo2=magic_kristo($qw16,$oo15,$qk17-1/3);}return array($tm3,$ns1,$wo2);}
function magic_kristo($qw16,$oo15,$qk17){if($qk17<0)$qk17+=1;else if($qk17>1)$qk17-=1;
if(6*$qk17<1)$sx18=$qw16+($oo15-$qw16)*$qk17*6;else if(2*$qk17<1)$sx18=$oo15;else if(3*$qk17<2)$sx18=$qw16+($oo15-$qw16)*(2/3-$qk17)*6;
else $sx18=$qw16;return round(255*$sx18);}
于 2012-08-16T11:06:49.390 に答える
0

それはすべて、彩度値をどのように変更するかによって異なります。単純な加算を行う場合は、絶対にクランプを使用する必要があります。つまり、255 を超える値を 255 に切り捨てます。ゼロ以下の値についても同様です。これにより、いくつかの色が重なります。オーバーフローをより困難にするために別の数式を使用することもできますが、これはユーザーが理解できない動作につながる可能性があります。実際、画像を変更すると、切り捨てによる情報の損失はほぼ当然のことです。ユーザーに警告し、元に戻す機能を提供しようとします。たとえば、一部のカメラのように、過飽和領域を白またはマゼンタで表示したり、点滅させたりします。ユーザーが情報の損失を引き起こさないようにすると、ユーザーの操作が制限されすぎてしまいます。

于 2012-08-14T15:43:37.377 に答える