【问题标题】:Php color replace on image图像上的PHP颜色替换
【发布时间】:2016-09-02 02:27:24
【问题描述】:

我有这个脚本用用户选择的另一种颜色替换黑色或白色,工作正常但是在某些颜色(紫色背景绿色书写)上它会在字母周围留下白色像素化边框? 我不知道该怎么办? 在这里看到 - http://marijasorganicpantry.com.au/imagephp.php

<?php
ob_start();
	$txtcolor=$_REQUEST['text1'];
	$r1txt=hexdec(substr($txtcolor,0,2));
    $g1txt=hexdec(substr($txtcolor,2,2));
	$b1txt=hexdec(substr($txtcolor,4,2));
	
	$backcolor=$_REQUEST['back1'];
	$r1back=hexdec(substr($backcolor,0,2));
    $g1back=hexdec(substr($backcolor,2,2));
	$b1back=hexdec(substr($backcolor,4,2));
	$imgname="demo_the-crown-prints_work-hard_5x7.jpg";
	
	$im = imagecreatefromjpeg($imgname);
	$w = imagesx($im);
	$h = imagesy($im); 
	$gd = imagecreatetruecolor($w,$h);
	imagecopyresampled($gd, $im, 0, 0, 0, 0, $w, $h, $w, $h);
	imagefilter($gd, IMG_FILTER_COLORIZE,$r1txt,$g1txt,$b1txt); 

	for($x=0;$x<$w;$x++) 
	{
		for($y=0;$y<$h;$y++)
			{
				$rgb = imagecolorat($gd, $x, $y);
				$r = ($rgb >> 16) & 0xFF;
				$g = ($rgb >> 8) & 0xFF;
				$b = $rgb & 0xFF;
				
				if ($r==255 and $g==255 and $b==255)
				{	
				$pixelColor=imagecolorallocatealpha($gd,$r1back,$g1back,$b1back,10);
				imagesetpixel($gd,$x,$y,$pixelColor);	
				}
			}
	}
	
imagejpeg($gd,NULL,100);
$outputBuffer = ob_get_clean();
$base64 = base64_encode($outputBuffer);
echo '<a id="downloadimage" style="text-decoration:none;" download>
	<img id="image2" width=150 height=250 src="data:image/jpeg;base64,'.$base64.'" />
	<li style="padding-top:7px;textalign:center;display:block;border-radius:10px;background-color:royaleblue;height:30px;width:100px;">download</li></a>';	
?>

【问题讨论】:

    标签: php replace colors


    【解决方案1】:

    因为原图中字母有边框,不是纯黑色,所以颜色不是

    R = 0
    G = 0
    B = 0
    

    我对您的原始代码进行了一些更改,以避免不必要的步骤。这是你需要的吗?

    <?php
    ob_start();
    $txtcolor="20FF00";
    $r1txt=hexdec(substr($txtcolor,0,2));
    $g1txt=hexdec(substr($txtcolor,2,2));
    $b1txt=hexdec(substr($txtcolor,4,2));
    
    $backcolor="FF0ED9";
    $r1back=hexdec(substr($backcolor,0,2));
    $g1back=hexdec(substr($backcolor,2,2));
    $b1back=hexdec(substr($backcolor,4,2));
    $imgname="demo_the-crown-prints_work-hard_5x7.jpg";
    
    $gd = imagecreatefromjpeg($imgname);
    $w = imagesx($gd);
    $h = imagesy($gd);
    for($x=0;$x<$w;$x++) 
    {
        for($y=0;$y<$h;$y++)
            {
                $rgb = imagecolorat($gd, $x, $y);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;
    
                if ($r>200 && $g>200 && $b>200)
                {   
                    $pixelColor=imagecolorallocate($gd,$r1back,$g1back,$b1back);
                    imagesetpixel($gd,$x,$y,$pixelColor);                   
                } else {
                    $pixelColor=imagecolorallocate($gd,$r1txt,$g1txt,$b1txt);
                    imagesetpixel($gd,$x,$y,$pixelColor);
                }
            }
    }
    
    imagejpeg($gd,'simpletext.jpg', 100);
    imagepng($gd,'simpletext.png', 0);
    ?>
    

    我已将结果保存在文件中,以便您查看 imagejpeg 和 imagepng 之间的质量差异

    【讨论】:

    • 谢谢,我已经去掉了大部分灰度,试图让图像变成真正的黑白,但是图像中仍然有一些灰点,所以它们显示为白色,我该怎么做将额外的灰色添加到代码中以便它们也被转换?我试过 if ($r==255 and $g==255 and $b==255 || $r==212 and $g==212 and $b==212 || $r==224 and $ g==224 和 $b==224 )但它不起作用代码有什么问题?
    • 如果您想假设原始图像只有白色和黑色,请尝试执行类似的操作 if ($r!==0 || $g!==0 || $b! ==0)。在您的代码中,您忘记了很多可能的组合;)
    • 放大时我可以看到很多灰点,所以我想如果我能得到它们的值并将它们全部添加进去,至少可以得到更好的质量并摆脱一些点 :) 我怎样才能在代码中添加更多的阴影?我被卡住了
    • 如果你使用这个 ($r!==0 || $g!==0 || $b!==0) 你会选择每个像素,它不是完美的白色,你可以认为它是黑色的。可能这个结果对你来说可能很好(如果你想保持简单)。否则,另一种解决方案是使用像 $r
    • 我的意思是使用 ($r!==0 || $g!==0 || $b!==0) 代替 ($r==255 and $g==255 and $ b==255) 在您的原始代码上
    猜你喜欢
    • 2010-12-05
    • 2010-12-09
    • 2018-05-11
    • 2011-05-16
    • 2012-08-24
    • 2016-12-17
    • 2011-07-12
    • 2018-11-14
    • 2015-12-19
    相关资源
    最近更新 更多