我想使用PHP GD为某些PNG着色。为了进行测试,我硬编码了红色(255,0,0),之后将其替换为动态变量。
例如,我有这两个图像:
图片1:
图片2:
使用我的代码,只有图像2可以正常工作。
但是,狗图像有某种灰色框,不知道它来自何处。
这是我正在使用的代码:
<?php
$im = imagecreatefrompng('dog.png');
imagealphablending($im, false);
imagesavealpha($im, true);
$w = imagesx($im);
$h = imagesy($im);
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$color = imagecolorsforindex($im, imagecolorat($im, $x, $y));
$r = ($color['red'] * 255) / 255;
$g = ($color['green'] * 0) / 255;
$b = ($color['blue'] * 0) / 255;
imagesetpixel($im, $x, $y, imagecolorallocatealpha($im, $r, $g, $b, $color['alpha']));
}
}
imagepng($im, 'result.png');
imagedestroy($im);
为什么它只能用于图像2但不能用于图像1?我只能想到图像1会出现某种Alpha蒙版。
希望有人可以帮助我
答案 0 :(得分:1)
使用imagefilter()
可以更轻松地完成此操作:
<?php
$im = imagecreatefrompng('dog.png');
imagefilter($im, IMG_FILTER_COLORIZE, 255, 0, 0);
imagepng($im, 'result.png');
imagedestroy($im);
答案 1 :(得分:0)
imagecolorallocate()
或与之等效的alpha文档中未提及它,但是有人指出in the comments只能在图像用完之前分配255种颜色。使用新颜色之前,请检查分配是否成功。如果有的话,请使用imagecolorclosestalpha()
获得下一个最好的东西。
<?php
$replace = [255, 0, 0];
array_walk($replace, function(&$v, $k) {$v /= 255;});
$im = imagecreatefrompng('dog.png');
for ($x = 0; $x < imagesx($im); $x++) {
for ($y = 0; $y < imagesy($im); $y++) {
$color = imagecolorsforindex($im, imagecolorat($im, $x, $y));
$r = $color["red"] * $replace[0];
$g = $color["green"] * $replace[1];
$b = $color["blue"] * $replace[2];
$a = $color["alpha"];
$newcolour = imagecolorallocatealpha($im, $r, $g, $b, $a);
if ($newcolour === false) {
$newcolour = imagecolorclosestalpha($im, $r, $g, $b, $a);
}
imagesetpixel($im, $x, $y, $newcolour);
}
}
imagepng($im, 'result.png');
imagedestroy($im);
答案 2 :(得分:0)
使用我的代码可以正常工作。我要做的就是添加imagepalettetotruecolor($im);