【问题标题】:Replace a color with another in an image with PHP用 PHP 将图像中的颜色替换为另一种颜色
【发布时间】:2023-09-04 17:44:01
【问题描述】:

有人可以帮我编写一个简单的脚本,使用 PHP 将图像中的特定颜色替换为另一种颜色吗? 这是一个示例(颜色从绿色变为黄色)。

【问题讨论】:

标签: php gd


【解决方案1】:

如果你的意思是在 PHP 中使用 GD 库,你应该检查一下imagefilter()

步骤是:

  • 从 .PNG 图像开始,内部使用白色,外部使用 alpha。
  • 使用 imagefilter($img, IMG_FILTER_COLORIZE, 0, 255, 0)) 其中 0,255,0 是您的 RGB 颜色(本例中为亮绿色)
  • 保存 alpha 并打印结果。

编辑、工作代码和说明。

我的意思是,黑色线条的外部使用 alpha,内部使用白色。这是示例图像:

这是一个为白色部分着色的工作代码:

header('Content-Type: image/png');

/* RGB of your inside color */
$rgb = array(0,0,255);
/* Your file */
$file="../test.png";

/* Negative values, don't edit */
$rgb = array(255-$rgb[0],255-$rgb[1],255-$rgb[2]);

$im = imagecreatefrompng($file);

imagefilter($im, IMG_FILTER_NEGATE); 
imagefilter($im, IMG_FILTER_COLORIZE, $rgb[0], $rgb[1], $rgb[2]); 
imagefilter($im, IMG_FILTER_NEGATE); 

imagealphablending( $im, false );
imagesavealpha( $im, true );
imagepng($im);
imagedestroy($im);

注意:我们必须否定值,因为 colorize 仅适用于非白色部分。我们可以通过使用带有白色边框的图像来解决此问题。

注意:此代码仅适用于黑色边框和白色内部图像。

【讨论】:

  • 我试过了,但它也把背景(透明的)变成了绿色。我应该将背景设为白色吗?
  • 在提到的那些使用 BRIGHTNESS 和高负值之前再做一个过滤步骤也很好,以确保图像仅包含纯黑色 (#000) 和纯白色 (#FFF) 颜色。无论文档说什么,使用 -10000 值和这个过滤器来避免半灰色像素。比 COLORIZE 更有意义,您设置的颜色将为黑色区域正确着色。一些 php 库使用此过程来应用黑白位掩码以使图像的自定义区域透明。
  • 这不只是为了换成相反的颜色吗?如果它是绿色到蓝色而不是绿色到绿色的对面呢?还是我对这段代码的理解有误?
  • 那个否定技巧很棒,谢谢,因为我试图用 colorize 着色,但不影响白色!
【解决方案2】:

我想答案是拥有多个版本的图像,然后根据选择的颜色加载正确的图像?

您可以使用 switch 语句来加载正确的图像

//get selected colour
    switch ($colour) {
    case "red":
        echo "<img src='RED IMAGE' ";
        break;
    case "blue":
        echo "<img src='blue IMAGE' ";
        break;
    case "green":
        echo "<img src='green IMAGE' ";
        break;
}

希望这会有所帮助。

【讨论】:

  • 如果用户想选择较浅/较深的红色怎么办?我无法制作 100 万张图片。这就是为什么我想要另一个解决方案(我认为使用 GD 库)。
  • 为什么这刚刚被否决?我知道这不是正确的解决方案,但问题并没有说明他们想要每种可能的颜色组合。
  • 可能投了反对票,这不是开发人员的思维方式:-)
【解决方案3】:

我试过这个:

<?php
$imgname = "1.gif";
$im = imagecreatefromgif ($imgname);
$index = imagecolorexact ($im,0,128,0);
imagecolorset($im,$index,240,255,0);
$imgname = "result.gif";
imagegif($im,$imgname);
?>
<img src="result.gif">

我没有替换每个绿色像素(衬衫颜色没有改变):

【讨论】:

  • 搞笑哈哈
【解决方案4】:
<?php
header("Content-type: image/png");
$im = imagecreate(200, 200)
imagefill($im, 0, 0, $red);

// above could come from an uploaded image
// find a blue in the image
$newblue = imagecolorclosest($im, 0, 0, 255);
// change it to green
imagecolorset($im, $newblue, 0, 255, 0);
imagepng($im);
imagedestroy($im);
?php>

在这里您可以找到最接近蓝色的颜色并替换为绿色。

【讨论】:

    【解决方案5】:

    缓慢但可靠的方法,遍历每个像素。

    function ReplaceColour($img, $r1, $g1, $b1, $r2, $g2, $b2)
    {
        if(!imageistruecolor($img))
            imagepalettetotruecolor($img);
        $col1 = (($r1 & 0xFF) << 16) + (($g1 & 0xFF) << 8) + ($b1 & 0xFF);
        $col2 = (($r2 & 0xFF) << 16) + (($g2 & 0xFF) << 8) + ($b2 & 0xFF);
    
        $width = imagesx($img); 
        $height = imagesy($img);
        for($x=0; $x < $width; $x++)
            for($y=0; $y < $height; $y++)
            {
                $colrgb = imagecolorat($img, $x, $y);
                if($col1 !== $colrgb)
                    continue; 
                imagesetpixel ($img, $x , $y , $col2);
            }   
    }
    

    【讨论】: