在开始之前,我只想说明我是一个PHP菜鸟。我想要做的是将PNG图像着色为一种颜色。因此,所有透明像素都将保持透明,并且所有非透明像素都将是该颜色。我已经搜索了许多网站的答案,但由于某种原因我找不到我想要的东西。
这是我根据我发现的不同例子进行的第一次尝试:
<?php
header('Content-Type: image/png');
$color = $_GET['color'];
$im = imagecreatefrompng($_GET['img']);
$width = imagesx($im);
$height = imagesy($im);
$imn = imagecreatetruecolor($width, $height);
imagealphablending($imn,false);
$col=imagecolorallocatealpha($imn,255,255,255,127);
imagesavealpha($imn,true);
imagefilledrectangle($imn,0,0,$width,$height,$col);
imagealphablending($imn,true);
imagecopy($imn, $im, 0, 0, 0, 0, $width, $height);
imagefilter($imn, IMG_FILTER_GRAYSCALE);
if ($color[0] == '#')
$color = substr($color, 1);
if (strlen($color) == 6)
$r = $color[0].$color[1];
$g = $color[2].$color[3];
$b = $color[4].$color[5];
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
imagefilter($imn, IMG_FILTER_COLORIZE, $r, $g, $b);
imagepng($imn);
imagedestroy($imn);
?>
在这里可以看到基本上我想要的完美例子。唯一的变化是,我希望它转换为用户指定的颜色而不是黑色。 Convert non-transparent pixels to black
谢谢
=============================== 10/17/2012更新
所以基于xception的答案,这是我用来执行他的脚本的代码:
<?php
$source = "test.png";
$temp = "temp.png";
$color = "red";
$final = "FINAL.png";
exec("convert $source -alpha extract -threshold 0 -negate -transparent white $temp");
exec("convert $temp -fill $color -opaque black $final");
?>
虽然有问题,但是有一个小问题。如下面的屏幕截图所示,有锯齿状边缘。关于如何平滑图像以使其看起来像在BEFORE屏幕截图中一样好的任何想法?
在:
在:
答案 0 :(得分:1)
基于您指向的链接的两个步骤示例:
convert <source> -alpha extract -threshold 0 -negate -transparent white <tmp>
convert <tmp> -fill red -opaque black <destination>
用适当的文件名替换<source>
,<tmp>
,<destination>
,将red
替换为您想要的颜色。
修改强>: 问题作者发现的较短版本:
exec("convert $source -threshold 100% +level-colors '#00FF00', $final");