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

У меня есть 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);

?>

Ответы [ 2 ]

1 голос
/ 06 июня 2011
@ imagecolortransparent($im, $xxxx); //not sure why this works

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

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

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

Другое дело, что вам кажется, что вам нужно позвонить 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);   
...