Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改&x201C;饱和”;使用PHP GD库创建图像?_Php_Image_Image Processing_Gd_Gdlib - Fatal编程技术网

更改&x201C;饱和”;使用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++) {

有一个关于如何使用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++) {
      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