1

编辑:感谢所有帮助但问题仍然存在的人。那么,有没有更好的公式来编辑饱和度而不需要钳位?非线性公式可能有效,但我不知道确切的好公式。谢谢

我正在尝试开发一个照片编辑系统,允许人们增加和减少色调/饱和度/亮度,这类似于 ipiccy.com 所做的。我正在使用 HSI<->RGB 转换。首先,每个像素都从 RGB 转换为 HSI。其次,用户指定她想要添加的饱和度。第三,系统将用户指定的值与第一步转换的原始饱和度值相加,然后将这些 HSI 值转换为 RGB。我的问题是,当我将新的 HSI 值转换回 RGB 时,一些 RGB 值超过 255。因此,颜色显示不正确。

我已经阅读和尝试了好几天,但没有成功。有谁知道如何解决它?欢迎任何线索或任何阅读或解决方案的链接。非常感谢。

4

2 回答 2

1

无需删除。代码确实格式错误,但感谢提供!

这段代码是由与我一起处理相同问题的其他人发送给我的,我已经收到了它,我将给你它的确切形式。我所做的只是在我的代码中实现它,所以请原谅错误的答案。

这是代码(3个功能)

gimmeHSL()将从 RGB 转换为 HSL

输入:R、G、B <=> {0, 255}, {0, 255}, {0, 255}

输出:H, S, L <=> {0, 360}, {0, 1}, {0, 1}

gimmeRGB()将从 RGB 转换为 HSL

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

输出:R、G、B <=> {0, 255}, {0, 255}, {0, 255}

magic_kristo(),我不知道它是做什么的,但它似乎被其他两个使用。

这是一个使用示例

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 回答