更改&x201C;饱和”;使用PHP GD库创建图像?
有一个关于如何使用PHP-GD库更改图像的色调的示例。但是我需要知道如何使用PHP-GD更改图像的饱和度。这是答案中成功改变图像色调的代码副本更改&x201C;饱和”;使用PHP GD库创建图像?,php,image,image-processing,gd,gdlib,Php,Image,Image Processing,Gd,Gdlib,有一个关于如何使用PHP-GD库更改图像的色调的示例。但是我需要知道如何使用PHP-GD更改图像的饱和度。这是答案中成功改变图像色调的代码副本 function imagehue(&$image, $angle) { if($angle % 360 == 0) return; $width = imagesx($image); $height = imagesy($image); for($x = 0; $x < $width; $x++) {
function imagehue(&$image, $angle) {
if($angle % 360 == 0) return;
$width = imagesx($image);
$height = imagesy($image);
for($x = 0; $x < $width; $x++) {
for($y = 0; $y < $height; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$alpha = ($rgb & 0x7F000000) >> 24;
list($h, $s, $l) = rgb2hsl($r, $g, $b);
$h += $angle / 360;
if($h > 1) $h--;
list($r, $g, $b) = hsl2rgb($h, $s, $l);
imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
}
}
}
努力更新: @Dai向我指出,这些线条有助于构建单个RGB像素的色码。所以我想这部分可以保持不变
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$alpha = ($rgb & 0x7F000000) >> 24;
在下一行中,我们将使用rgb2hsl($r,$g,$b)将RGB值转换为HSL编码>并将其分配给列表($h、$s、$l)
。我现在被困的地方是这些线
$s += $saturationPercentage / 100;
if($s > 1) $s--;
我理解语法,但不确定如何处理这些语法,或者它们是否是必需的。如果没有答案,那么提供一些有用的提示/建议就更好了。我正在尝试使用代码将饱和度从100%降低到80%,但我得到的结果是。我认为您需要类似的东西
$s=$s * (100+$saturationPercentage)/100
否则,您只是向每个值添加一个常量,而不是现有值的百分比
此外,如果新饱和度超过1,则减1,最好将其设置为1.0,即完全饱和,如下所示:
if($s>1)$s=1
否则,假设得到的饱和度为1.3(即非常非常饱和),则将其转换为0.3
,即非常不饱和,而不是1.0(完全饱和)
因此,如果$s
为0.7,加上10%,您将得到
$s = 0.7 * (100 + 10)/100
$s = 0.7 * 1.1
$s = 0.77
您发布的最后一段代码(“我真正迷路的地方”)有什么问题。没有执行任何计算,只是进行位移和位基化,以提取表示每个像素颜色分量(红色、绿色、蓝色和不透明度)的字节(0-255)值。@Dai TBH,我第一次遇到这些二进制概念,真的不明白它们在做什么。我当然应该研究这些,但现在真的负担不起。请看更新的问题。你的意思是说它们应该保持不变吗代码>我希望将饱和度从100%降低到80%。我还错在哪里?所以你会通过-20
,或者将你的代码更改为$s*=$saturationPercentage/100
我现在看到问题了-你的图像是托盘化的,不是真彩色的。加载图像作为快速修复后,请尝试调用imagepaletetotruecolor($image)
。要找到合适的解决方案,请看这里。基本上,当您进行位移位以获得$r
、$g
和$b
时,您得到的是$r
和$g
的零以及$b
调色板中的索引,而不是您所期望的。这是100%有效的。谢谢你抽出时间。请最后一次查看修改代码的最终更新,其中包括您的所有建议,并请指出是否还有任何错误。以下是我的理解。如果我需要完全去饱和图像,我可以调用-100,我认为调用任何超过100的值都是毫无意义的。有什么建议吗?很高兴它成功了!我又看了一眼,我认为你现在说得很“正确”。添加饱和度是完全合法的——有时人们想在被淘汰的图片中添加一些流行音乐。
$s = 0.7 * (100 + 10)/100
$s = 0.7 * 1.1
$s = 0.77