php 改变图片颜色,使用PHP将图像中的颜色替换为另一种颜色

这篇博客介绍了一种通过调整色调绝对误差来实现图像中特定颜色替换的方法。代码示例展示了如何使用RGB到HSL色彩转换进行颜色匹配,并在满足色调误差范围内替换目标颜色。同时,讨论了考虑颜色亮度和阴影以提高图像质量的重要性。
摘要由CSDN通过智能技术生成

编辑2:

您可能需要优化某些内容并更改hueAbsoluteError以满足您的需求,但色调是获得启发和更清晰图像质量的方式(从

https://gist.github.com/brandonheyer/5254516开始的功能):

function RGBtoHSL( $r, $g, $b ) {

$r /= 255;

$g /= 255;

$b /= 255;

$max = max( $r, $g, $b );

$min = min( $r, $g, $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, 2 ), 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(255, 0, 255);

$hueAbsoluteError = 0.4;

$replacementColor = RGBtoHSL(0, 192, 239);

/* ---------------------------------------------- */

$filename = 'img/Mascots_Aviators_General-copy.png';

$im = imagecreatefrompng($filename);

$out = imagecreatetruecolor(imagesx($im), imagesy($im));

$transColor = imagecolorallocatealpha($out, 254, 254, 254, 127);

imagefill($out, 0, 0, $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, $x, $y, $transColor);

}

else {

imagesetpixel($out, $x, $y, imagecolorallocatealpha($out, $red, $green, $blue, $alpha));

}

}

}

imagecolortransparent($out, $transColor);

imagesavealpha($out, TRUE);

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

imagepng($out);

6Yyuq.png

编辑:

更好的解决方案 – 确定颜色是否需要更换(使用此方法).确定替换颜色的色调(我不知道它是否是正确的术语,我的意思是亮度和黑暗).将其涂抹在更换颜色上,使其具有阴影或AA感.

所以,正如我在评论中所说,你需要确定这种颜色是否真的是ping(黑暗,光线等).最简单的解决方案是对特定颜色通道应用绝对误差方法.可能有(肯定有)更好的通用方法,但我希望这样做:

$color = [255, 0, 255];

$colorAbsoluteError = [150, 0, 150];

$replacementColor = [0, 192, 239];

$filename = 'img/Mascots_Aviators_General-copy.png';

$im = imagecreatefrompng($filename);

$out = imagecreatetruecolor(imagesx($im), imagesy($im));

$transColor = imagecolorallocatealpha($out, 254, 254, 254, 127);

imagefill($out, 0, 0, $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;

if ((($red >= $color[0] - $colorAbsoluteError[0]) && ($color[0] + $colorAbsoluteError[0]) >= $red) &&

(($green >= $color[1] - $colorAbsoluteError[1]) && ($color[1] + $colorAbsoluteError[1]) >= $green) &&

(($blue >= $color[2] - $colorAbsoluteError[2]) && ($color[2] + $colorAbsoluteError[2]) >= $blue)){

$red = $replacementColor[0];

$green= $replacementColor[1];

$blue = $replacementColor[2];

}

if ($alpha == 127) {

imagesetpixel($out, $x, $y, $transColor);

}

else {

imagesetpixel($out, $x, $y, imagecolorallocatealpha($out, $red, $green, $blue, $alpha));

}

}

}

imagecolortransparent($out, $transColor);

imagesavealpha($out, TRUE);

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

imagepng($out);

0CLeS.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值