Использование GD для изменения цвета одноцветной фигуры на прозрачном фоне с сохранением прозрачности

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

<?php
$imgname = "whiteim.png"; 
$im = imagecreatefrompng ($imgname);

imagetruecolortopalette($im,false, 255);

$index = imagecolorclosest ( $im,  255,255,255 ); // get White COlor
imagecolorset($im,$index,255,0,0); // SET NEW COLOR

$imgname = "result.png";
imagepng($im, $imgname ); // save image as png
imagedestroy($im);

?>

person Kwanzz    schedule 11.03.2011    source источник


Ответы (2)


@ imagecolortransparent($im, $xxxx); //not sure why this works

Я думаю, что это работает, потому что imagecolortransparent делает данный цвет (где вы разместили $xxxx) прозрачным, в этом случае $xxxx не содержит значения. Таким образом, прозрачными становятся все пиксели, не содержащие значения цвета.

person Michiel    schedule 06.06.2011

Во-первых, я не мог заставить это работать, используя imagetruecolortopalette. Не совсем уверен, что в вашем случае можно использовать функцию imagefill (вы нужно знать, где начать заливку, и это работает, если у вас есть одна белая область), но это то, что я использовал.

Другое дело, что вам нужно вызвать imagesavealpha, прежде чем вы сохраните любую альфа-информацию в изображение png, иначе она будет потеряна. Мне трудно сказать, почему это не настройка по умолчанию.

В общем, мой подход был таким:

$imgname = "whiteim.png";.                                                                                                                                
$im = imagecreatefrompng ($imgname);                                                                                                                    

imagefill($im, 0,0, imagecolorallocate($im, 255,0,0));                                                                                                  

$imgname = "result.png";                                                                                                                                
imagesavealpha($im, True);                                                                                                                              
imagepng($im, $imgname ); // save image as png                                                                                                          
imagedestroy($im);   
person Grzegorz Oledzki    schedule 11.03.2011
comment
Это не сработало для меня. может быть, это как-то связано с моим имиджем? (прикрепил). приведенный ниже код работает отлично, но я не понимаю, почему. Это работает независимо от того, на что вы замените $xxxx. Если я уберу эту строку, это не сработает? Кто-нибудь знает, почему? - person Kwanzz; 12.03.2011