使用PHP GD为PNG着色

时间:2019-06-27 21:27:57

标签: php gd php-gd colorize

我想使用PHP GD为某些PNG着色。为了进行测试,我硬编码了红色(255,0,0),之后将其替换为动态变量。

例如,我有这两个图像:

图片1:6Bt.png

图片2:6Bd.png

使用我的代码,只有图像2可以正常工作。 6BC.png

但是,狗图像有某种灰色框,不知道它来自何处。 6BA.png

这是我正在使用的代码:

<?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蒙版。

希望有人可以帮助我

3 个答案:

答案 0 :(得分:1)

使用imagefilter()可以更轻松地完成此操作:

<?php
$im = imagecreatefrompng('dog.png');
imagefilter($im, IMG_FILTER_COLORIZE, 255, 0, 0);
imagepng($im, 'result.png');
imagedestroy($im);

结果: enter image description here

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

输出:enter image description here

答案 2 :(得分:0)

使用我的代码可以正常工作。我要做的就是添加imagepalettetotruecolor($im);