PHP:PNG着色(1色)

时间:2012-10-15 23:39:54

标签: php png transparency tint

在开始之前,我只想说明我是一个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屏幕截图中一样好的任何想法?

在:

BEFORE

在:

AFTER

1 个答案:

答案 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");