PHP - 替换图像中的颜色

Posted

技术标签:

【中文标题】PHP - 替换图像中的颜色【英文标题】:PHP - Replace colour within image 【发布时间】:2010-12-05 15:12:11 【问题描述】:

希望有人能帮忙

我制作了一个屏蔽图像的脚本......但是它依赖于一种颜色来屏蔽(“绿屏”样式)。问题是如果我要遮罩的图像包含该颜色,它就会被破坏。

我要做的是在屏蔽图像之前用类似的颜色(例如 0,0,254)替换任何出现的键控颜色 (0,0,255)。

我发现了一些基于 gif 或 256 色 PNG 的解决方案,因为它们已被编入索引。

所以我的问题也是,将其转换为 gif 或 256 png 然后查看索引并替换颜色或搜索每个像素并替换颜色是否会更有效。

谢谢,

【问题讨论】:

“屏蔽”是什么意思?有图像的透明部分?你用绿色(或你使用的任何色键颜色)到底是为了什么? 通过遮罩我的意思是用我的色键颜色填充一个正方形,然后用透明像素从中切割出一个形状,然后将其覆盖在图片上。然后用透明像素替换色键颜色 【参考方案1】:

您需要打开输入文件并扫描每个像素以检查您的色键值。

类似这样的:

// Open input and output image
$src = imagecreatefromJPEG('input.jpg') or die('Problem with source');
$out = ImageCreateTrueColor(imagesx($src),imagesy($src)) or die('Problem In Creating image');

// scan image pixels
for ($x = 0; $x < imagesx($src); $x++) 
    for ($y = 0; $y < imagesy($src); $y++) 
        $src_pix = imagecolorat($src,$x,$y);
        $src_pix_array = rgb_to_array($src_pix);

            // check for chromakey color
            if ($src_pix_array[0] == 0 && $src_pix_array[1] == 0 && $src_pix_array[2] == 255) 
                $src_pix_array[2] = 254;
            


        imagesetpixel($out, $x, $y, imagecolorallocate($out, $src_pix_array[0], $src_pix_array[1], $src_pix_array[2]));
    



// write $out to disc

imagejpeg($out, 'output.jpg',100) or die('Problem saving output image');
imagedestroy($out);

// split rgb to components
function rgb_to_array($rgb) 
    $a[0] = ($rgb >> 16) & 0xFF;
    $a[1] = ($rgb >> 8) & 0xFF;
    $a[2] = $rgb & 0xFF;

    return $a;

【讨论】:

这看起来棒极了...在效率方面,您认为它与将图像转换为 256 托盘相比如何,使用 imagecolorexact 和 imagecolorset 替换任何出现的颜色,然后将其转换回真实彩色图像? 它工作得很好,但我刚刚对其进行了测试,将其转换为 256 托盘图像并返回的效率至少要低 5 倍......但对于图像质量来说,它是卓越的,因为质量会丢失将其转换为 256 色时,谢谢 radio4fan!【参考方案2】:

这是首先转换为 256 托盘的替换颜色解决方案:

//Open Image
$Image = imagecreatefromJPEG('input.jpg') or die('Problem with source');

//set the image to 256 colours
imagetruecolortopalette($Image,0,256);

//Find the Chroma colour
$RemChroma = imagecolorexact( $Image,  0,0,255 );

//Replace Chroma Colour
imagecolorset($Image,$RemChroma,0,0,254);

//Use function to convert back to true colour
imagepalettetotruecolor($Image);




function imagepalettetotruecolor(&$img)
    
        if (!imageistruecolor($img))
        
            $w = imagesx($img);
            $h = imagesy($img);
            $img1 = imagecreatetruecolor($w,$h);
            imagecopy($img1,$img,0,0,0,0,$w,$h);
            $img = $img1;
        
    

我个人更喜欢 radio4fans 解决方案,因为它是无损的,但如果您的目标是速度,这是更好的。

【讨论】:

以上是关于PHP - 替换图像中的颜色的主要内容,如果未能解决你的问题,请参考以下文章

用另一种颜色替换图像中的特定颜色

我可以在 PHP 中使用 GD 库交换图像中的颜色吗?

在快速函数中崩溃以替换 bmp 中的特定颜色

替换 PNG 文件中的颜色

PS图片中字体或图像的颜色替换

PHP colorPalette函数返回图像中的所有颜色