我从 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替换另一个图像的特定RGB颜色的更多相关文章

  1. Swift 的UIColor 类的详解使用和十六进制转RGB

    今天我就带你走进Swift的UIColor。)/*********************************************************//*十六进制转换成RGB*/ZSJ_View.backgroundColor=ZSJ_Color_Conversion/*********************************************************//*可用的颜色有:blackColor()->UIColor//0.0whitedarkGrayColor()

  2. PHP中十六进制颜色与RGB颜色值互转的方法

    今天小编就为大家分享一篇关于PHP中十六进制颜色与RGB颜色值互转的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 如何使用PHP检测“轻”颜色

    我正在开展一个动态商店项目,我使用循环来打印产品的所有颜色选项作为颜色框,但我真的需要添加一个“边框”这些颜色很轻.我尝试了以下的东西,但它是非常有限的,它实际上仅限于白色,它不会捕获像#ddd,#eea…等这是我的循环:颜色是后端的数组,如:White,#000,#cc0000等.在if/else条件中添加所有异常也是不实际的,任何快速的想法?

  4. .net – 如何在图像中获得多数颜色?

    我想在.NET中检索背景图像中的大多数颜色.可能吗?您可以循环遍历图像中的所有像素,并使用getPixel方法确定RGB值.然后,您可以使用字典存储ARGB值以及计数.然后,您可以查看图像中最常出现的ARGB值.正如所指出的,这并没有对类似的颜色表示同情.如果你想要一个更“普通”的多数颜色,你可以有一个相似性的阈值.例如而不是:你可以这样做:您可以将10的阈值提高到您需要的任何值.

  5. 如何使用PHP制作较浅版本的颜色?

    如果这不存在,那么最短的代码是什么?建议,代码或想法都是我的答案.谢谢.ThisSOquestion有一个完整的PHP脚本,可以将RGB转换为HSL颜色,并增加其HSL颜色的H分量–改为增加L应该是微不足道的.

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

    我从https://stackoverflow.com/a/32710756/1620626导出了一个完美的颜色替代脚本.我想用图像背景替换目标颜色.原始图像用浅绿色背景(rgb:0b255b1).我可以用蓝色代替它,但我没有想法如何替换图像.这是脚本.这是原始图像.一旦我用脚本处理这张照片.我有这个脚本完美地替换了新的目标颜色.现在我想从蓝色变成背景.所以最后的想法是.这个女孩在背景图像我选择.

  7. ios – 从ARKit获取RGB“CVPixelBuffer”

    我正试图从Apple的ARKit获得RGB色彩空间的CVPixelBuffer.在ARSessionDelegate的funcsession(_session:ARSession,didUpdateframe:ARFrame)方法中,我得到了ARFrame的一个实例.在页DisplayinganARExperiencewithMetal我发现此像素缓冲区在ycbcr(YUV)颜色空间.我需要将其转

  8. jQuery和颜色计算

    目前我的H1标签设置为#8c0000(深红色).使用jQuery,我想得到H1的颜色,然后根据h1的颜色进行计算,以确定如果我想要几个阴影更暗的新颜色的十六进制值.原因是我想通过创建“插入”文本阴影来使用CSS3的新文本阴影属性来创建“浮雕”效果.我相信,要获得H1元素颜色,可以使用:但是,我该怎么做这个值来计算一个更暗的阴影?PS–看到H1颜色将动态设置,我不能只是在固定的文本阴影中硬编码,这就是我需要计算的原因…

  9. jquery css颜色值返回RGB?

    在我的CSS文件中:我试过:如何获得HEX代码?

  10. 使用jQuery返回颜色名称

    解决方法尝试从rgb值中获取名称会很麻烦.我建议您使用jQueryColorplugin来确定当前颜色是否为特定值:

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部