загадочный transparent

Igor Ageyev

Новичок
загадочный transparent

Казалось бы простая задача - генерация gif файла с прозрачностью.
Допустим, требуется создать изображение 20х20 пикселей, верхняя половина которого должна быть прозрачной, а нижняя окрашена в желтый цвет (FFFF00)

PHP:
$image = imagecreatetruecolor(20, 20); // создаем изображение 20х20 пикселей

$alpha = imagecolorallocate($image,255,0,0); // цвет который должен быть прозрачным
imagefill($image, 0, 0, $alpha); // закрашиваем все изображение
imagecolortransparent($image,$alpha); // делаем цвет $alpha прозрачным

$color = imagecolorallocate($image, 255, 255, 0); // цвет для нижней половины
imagefilledrectangle ($image, 0, 10, 20, 20, $color);// закрашиваем нижнюю половину

imagegif($image, "test.gif"); // сохраняем изображение
Результат получается совершенно противоположный. прозрачной становится нижняя половина, т.е. та которая должна быть желтой.

Опытным путем я пришел к желаемому результату, но почему этот код работает никак не могу понять.

Если во вновь созданном изображении сначала назначить любой цвет прозрачным (с помощью imagecolortransparent), то фон всего изображения становится невидимым. Причем если в последующем закрашивать какую либо область изображения этим цветом, закрашиваемая область не будет прозрачной!!!

Привожу этот нелогичный, но решающий задачу, код:

PHP:
$image = imagecreatetruecolor(20, 20); // создаем изображение 20х20 пикселей

$color = imagecolorallocate($image,255,255,0); // регистрируем желтый цвет
imagecolortransparent($image, $color); // делаем этот цвет прозрачным

imagefilledrectangle ($image, 0, 10, 20, 20, $color);// а теперь закрашиваем им половину изображения

imagegif($image, "test.gif"); // сохраняем изображение
Где грабли?
 

Akick

Новичок
imagetruecolortopalette
перед записью гифа

или imagecreate при создании.
 

OZ

Новичок
The transparent color is a property of the image, transparency is not a property of the color. Once you have set a color to be the transparent color, any regions of the image in that color that were drawn previously will be transparent.
То есть, сначала надо рисовать, потом делать прозрачным.
Пробуй:
PHP:
$image = imagecreatetruecolor(20, 20); // создаем изображение 20х20 пикселей 

$alpha = imagecolorallocate($image,255,0,0); // цвет который должен быть прозрачным 
imagefill($image, 0, 0, $alpha); // закрашиваем все изображение 

$color = imagecolorallocate($image, 255, 255, 0); // цвет для нижней половины 
imagefilledrectangle ($image, 0, 10, 20, 20, $color);// закрашиваем нижнюю половину 

imagecolortransparent($image,$alpha); // делаем цвет $alpha прозрачным 

imagegif($image, "test.gif"); // сохраняем изображение
Akick, чушь несёшь.
 

Igor Ageyev

Новичок
Автор оригинала: OZ
То есть, сначала надо рисовать, потом делать прозрачным.
Пробуй:
Спасибо, но результат тот же самый, что в моем первом примере;)

Автор оригинала: Akick
imagetruecolortopalette
перед записью гифа
или imagecreate при создании.
Большое спасибо. При использовании imagetruecolortopalette или imagecreate выходит ожидаемый результат.

Т.е. работающий код будет таким:

PHP:
$image = imagecreatetruecolor(20, 20); // создаем изображение 20х20 пикселей 

$alpha = imagecolorallocate($image,255,0,0); // цвет который должен быть прозрачным 
imagefill($image, 0, 0, $alpha); // закрашиваем все изображение 
imagecolortransparent($image,$alpha); // делаем цвет $alpha прозрачным 

$color = imagecolorallocate($image, 255, 255, 0); // цвет для нижней половины 
imagefilledrectangle ($image, 0, 10, 20, 20, $color);// закрашиваем нижнюю половину 

imagetruecolortopalette($image, true, 255); //  по совету Akick 
imagegif($image, "test.gif"); // сохраняем изображение
Once you have set a color to be the transparent color, any regions of the image in that color that were drawn previously will be transparent.
Спасибо за инфу. Можно узнать источник? Является ли это багом? Если нет, то это тот эффект, который мне нужен. Заранее не могу знать какой цвет не будет использоваться при рисовании, а значит и зарезервировать его как прозрачный.

Работаю над утилитой по смене цветового решения графики пользовательского интерфейса.
Изначально создается для одной CMS, но решение будет универсальным (исходники выложу).

P.S. рад, что есть такой замечательный ресурс, как phpclub и специалисты, готовые поделиться своим опытом.
 
Сверху