Раскрасить PNG с помощью PHP GD - PullRequest
1 голос
/ 28 июня 2019

Я хочу раскрасить некоторые PNG, используя PHP GD.Для тестирования я жестко закодировал красный цвет (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.

Надеюсь, кто-нибудь может мне помочь

Ответы [ 3 ]

1 голос
/ 28 июня 2019

Это можно сделать проще, используя imagefilter():

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

Результат: enter image description here

0 голосов
/ 28 июня 2019

Я получил его, используя мой код.Все, что мне нужно было сделать, это добавить imagepalettetotruecolor($im);

0 голосов
/ 28 июня 2019

Это не упомянуто в документации для imagecolorallocate() или ее альфа-эквивалента, но кто-то указал в комментариях , что вы можете выделить только 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

...