Използване на 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