Раскрасить изображение PNG с помощью PHP GD - PullRequest
0 голосов
/ 12 марта 2011

У меня есть изображение PNG с прозрачным фоном и белым кружком. Я пытаюсь раскрасить белый круг в определенный цвет, но мне трудно использовать этот код:

$src = imagecreatefrompng('circle.png');

$handle = imagecolorclosest($src, 255,255,255);
imagecolorset($src,$handle,100,100,100);

$new_image_name = "new_image.png";
imagepng($src,$new_image_name);
imagedestroy($src)

Любые предложения будут действительно полезны. Заранее спасибо.

1 Ответ

2 голосов
/ 12 марта 2011

Я полагаю, что ваше PNG-изображение имеет альфа-прозрачность, что делает imagecolorset() бесполезным, поскольку вы просто удалите прозрачность (или получите неровные края).

Если у вас есть только круг, вам лучше создать новое изображение с помощью GD и нарисовать ваш круг с помощью imagefilledellipse().

Однако, если «круг» немного сложнее, чем просто круг, это значительно усложняет ваш код. Однако вы можете использовать библиотеку абстракций GD, такую ​​как WideImage , чтобы значительно упростить эту задачу. Итак, чтобы раскрасить прозрачную «маску», вы можете просто сделать следующее с WideImage:

// 1. Load Image
$original = WideImage::load('circle.png');

// 2. Get Transparency Mask
$mask = $original->getMask();

// 3. Dispose Original
$original->destroy();

// 4. Create New Image
$colorized = WideImage::createTrueColorImage($mask->getWidth(), $mask->getHeight());

// 5. Colorize Image
$bg = $colorized ->allocateColor(255, 0, 0);
$colorized->fill(0, 0, $bg);

// 6. Apply Transparency Mask
$colorized->applyMask($mask);

// 7. Dispose mask
$mask->dispose();

// 8. Save colorized
$colorized->save($new_image_name);

// 9. Dispose colorized
$colorized->dispose();

Большинство из 9 вышеперечисленных шагов можно легко выполнить с помощью GD, за исключением шагов 2 и 6 ... Это можно сделать с помощью цикла, некоторых математических операций и множества вызовов imagecolorat() и imagecolorset().

...