使用PHP替换另一个图像的特定RGB颜色

前端之家收集整理的这篇文章主要介绍了使用PHP替换另一个图像的特定RGB颜色前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从 https://stackoverflow.com/a/32710756/1620626导出了一个完美的颜色替代脚本.我想用图像背景替换目标颜色.原始图像用浅绿色背景(rgb:0b255b1).我可以用蓝色代替它,但我没有想法如何替换图像.这是脚本.

这是原始图像.

一旦我用脚本处理这张照片.我有这个

脚本完美地替换了新的目标颜色.现在我想从蓝色变成背景.所以最后的想法是.这个女孩在背景图像我选择.

这是代码

<?PHP
//https://stackoverflow.com/a/32710756/1620626
function RGBtoHSL( $r,$g,$b ) {
    $r /= 255;
    $g /= 255;
    $b /= 255;
    $max = max( $r,$b );
    $min = min( $r,$b );
    $l = ( $max + $min ) / 2;
    $d = $max - $min;
    if( $d == 0 ){
        $h = $s = 0;
    } else {
        $s = $d / ( 1 - abs( 2 * $l - 1 ) );
        switch( $max ){
            case $r:
                $h = 60 * fmod( ( ( $g - $b ) / $d ),6 );
                if ($b > $g) {
                    $h += 360;
                }
                break;
            case $g:
                $h = 60 * ( ( $b - $r ) / $d + 2 );
                break;
            case $b:
                $h = 60 * ( ( $r - $g ) / $d + 4 );
                break;
        }
    }
    return array( round( $h,2 ),round( $s,round( $l,2 ) );
}

function HSLtoRGB( $h,$s,$l ){
    $c = ( 1 - abs( 2 * $l - 1 ) ) * $s;
    $x = $c * ( 1 - abs( fmod( ( $h / 60 ),2 ) - 1 ) );
    $m = $l - ( $c / 2 );
    if ( $h < 60 ) {
        $r = $c;
        $g = $x;
        $b = 0;
    } else if ( $h < 120 ) {
        $r = $x;
        $g = $c;
        $b = 0;
    } else if ( $h < 180 ) {
        $r = 0;
        $g = $c;
        $b = $x;
    } else if ( $h < 240 ) {
        $r = 0;
        $g = $x;
        $b = $c;
    } else if ( $h < 300 ) {
        $r = $x;
        $g = 0;
        $b = $c;
    } else {
        $r = $c;
        $g = 0;
        $b = $x;
    }
    $r = ( $r + $m ) * 255;
    $g = ( $g + $m ) * 255;
    $b = ( $b + $m  ) * 255;
    return array( floor( $r ),floor( $g ),floor( $b ) );
}

/* ---------------CHANGE THESE------------------- */
$colorToReplace = RGBtoHSL(0,255,1);//target color
$hueAbsoluteError = 7;//the more the clearer
$replacementColor = RGBtoHSL(0,192,239);//new color
/* ---------------------------------------------- */

$filename = 'images/01.png';
$im = imagecreatefrompng($filename);
$out = imagecreatetruecolor(imagesx($im),imagesy($im));
$transColor = imagecolorallocatealpha($out,254,127);
imagefill($out,$transColor);

for ($x = 0; $x < imagesx($im); $x++) {
    for ($y = 0; $y < imagesy($im); $y++) {
        $pixel = imagecolorat($im,$x,$y);

        $red = ($pixel >> 16) & 0xFF;
        $green = ($pixel >> 8) & 0xFF;
        $blue = $pixel & 0xFF;
        $alpha = ($pixel & 0x7F000000) >> 24;

        $colorHSL = RGBtoHSL($red,$green,$blue);

        if ((($colorHSL[0]  >= $colorToReplace[0] - $hueAbsoluteError) && ($colorToReplace[0] + $hueAbsoluteError) >= $colorHSL[0])){
            $color = HSLtoRGB($replacementColor[0],$replacementColor[1],$colorHSL[2]);
            $red = $color[0];
            $green= $color[1];
            $blue = $color[2];
        }

        if ($alpha == 127) {
            imagesetpixel($out,$y,$transColor);
        }
        else {
            imagesetpixel($out,imagecolorallocatealpha($out,$red,$blue,$alpha));
        }
    }
}
imagecolortransparent($out,$transColor);
imagesavealpha($out,TRUE);
header('Content-type: image/png');
imagepng($out);
?>
您只需读取两个图像,源和背景,并从背景图像中获取像素并设置为源.

以下是您上面代码的最后一部分,显示了这个想法:

$filename = 'images/01.png';
$bgFilename = 'images/background.png';
$im = imagecreatefrompng($filename);
$bg = imagecreatefrompng($bgFilename);
$out = imagecreatetruecolor(imagesx($im),$y);
        $bgPixel = imagecolorat($bg,$y);

        $red = ($pixel >> 16) & 0xFF;
        $green = ($pixel >> 8) & 0xFF;
        $blue = $pixel & 0xFF;
        $alpha = ($pixel & 0x7F000000) >> 24;
        $colorHSL = RGBtoHSL($red,$blue);

        if ((($colorHSL[0]  >= $colorToReplace[0] - $hueAbsoluteError) && ($colorToReplace[0] + $hueAbsoluteError) >= $colorHSL[0])){
            // Instead of taking the replacementColor
            /* $color = HSLtoRGB($replacementColor[0],$colorHSL[2]); */
            /* $red = $color[0]; */
            /* $green= $color[1]; */
            /* $blue = $color[2]; */
            // We just take colors from the backround image pixel
            $red = ($bgPixel >> 16) & 0xFF;
            $green = ($bgPixel >> 8) & 0xFF;
            $blue = $bgPixel & 0xFF;
        }

        if ($alpha == 127) {
            imagesetpixel($out,TRUE);
header('Content-type: image/png');
imagepng($out);

结果可能如下所示:

猜你在找的PHP相关文章