2

在开始之前,我只想说明我是一个 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);

?>

基本上可以在这里看到我想要的一个完美的例子。唯一的变化是,我希望将其转换为用户指定的颜色,而不是黑色。 将不透明像素转换为黑色

谢谢你

================================ 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");
?>

它工作,但是有一个小问题。如下图所示,边缘呈锯齿状。关于如何平滑图像使其看起来和之前的屏幕截图一样漂亮的任何想法?

前:

前

后:

后

4

1 回答 1

1

基于您指向的链接的两步示例:

convert <source> -alpha extract -threshold 0 -negate -transparent white <tmp>
convert <tmp> -fill red -opaque black <destination>

replace <source>, <tmp>,<destination>用适当的文件名,用red你想要的颜色替换。

编辑:问题作者找到的较短版本:

exec("convert $source -threshold 100% +level-colors '#00FF00', $final");
于 2012-10-15T23:59:04.290 回答