使用PHP将图像中的颜色替换为另一种颜色

时间:2012-08-29 13:16:11

标签: php gd

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

before after

5 个答案:

答案 0 :(得分:20)

如果您打算在PHP中使用GD库,则应检查imagefilter()

步骤是:

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

编辑,工作代码和说明。

我的意思是,使用alpha表示黑线的OUTER和白色INSIDE。这是示例图像: WhiteInAlphaOut

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

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);

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

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

答案 1 :(得分:1)

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

您可以使用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;
}

希望这有帮助。

答案 2 :(得分:1)

<?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>

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

答案 3 :(得分:1)

我试过了:

<?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">

而不是替换每个绿色像素我得到了这个(衬衫颜色没有改变):

the shirt wasn't replaced

答案 4 :(得分:0)

缓慢但肯定的方法,迭代每个像素。

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);
        }   
}