Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: imagecolortransparent() не работает
 
 автор: СерегаВЕБ   (28.01.2006 в 15:16)   письмо автору
5 Кб
 
 

Надо из того что на рисунке слева получить то что справа. Делаю так:

 imagecolortransparent ($im ,0xDD00AA);

Далее, если сохранить в GIF, то розовый цвет так и остается.
Если сохранить в PNG, то в Опере вроде цвет становится прозрачным, в проводнике то же все хорошо, а если смотреть через IE или открыть в Photoshope то опять виден розовый цвет.
Что делать?

   
 
 автор: glsv (Дизайнер)   (29.01.2006 в 06:36)   письмо автору
 
   для: СерегаВЕБ   (28.01.2006 в 15:16)
 

Вы не совсем правильно работаете с цветом. Цвет сначала нужно определить с помощью функции imagecolorallocate().

$color = imagecolorallocate ($im, $red, $green, $blue);
imagecolortransparent($im $color);

$red, $green, $blue – это переменные, в которых содержатся числовые значения RGB. Например: 24, 255, 68

   
 
 автор: СерегаВЕБ   (30.01.2006 в 12:11)   письмо автору
 
   для: glsv (Дизайнер)   (29.01.2006 в 06:36)
 

Эту штуку я уже пробовал -- не помогает.
Можь есть каконьть пример с этой функцией?

   
 
 автор: XPraptor   (30.01.2006 в 12:39)   письмо автору
 
   для: СерегаВЕБ   (30.01.2006 в 12:11)
 

Вот, когда то Дизайнер тоже показал мне как добиться прозрачности и оно до сих пор в силе. (особое внимание gd библиотеке, некоторые версии сбойные по умолчанию и на локалке нужно пробывать разные варианты)

// Обработка изображения для поддержки прозрачности
//определяем какой цвет сделать прозрачным ($dest_img - хэндл изображения с которым работаем)
$backgr = imagecolorallocate($dest_img, 0, 0, 0);
imagetruecolortopalette($dest_img, true, 1);
imagecolortransparent($dest_img, $backgr);

   
 
 автор: СерегаВЕБ   (30.01.2006 в 21:19)   письмо автору
 
   для: XPraptor   (30.01.2006 в 12:39)
 

Спасибо, сработало. Значит все дело было в палитре.
Но все таки палитру надо ставить после определения прозрачного цвета, а то он может поменятся на близкий к нему, встретившийся на изображении:

imagecolortransparent($im, 0xdd00aa);
imagetruecolortopalette($im, true, 256);

   
 
 автор: glsv (Дизайнер)   (31.01.2006 в 00:33)   письмо автору
 
   для: СерегаВЕБ   (30.01.2006 в 21:19)
 

Смысл был в том, чтобы ужать палитру до приемлемого минимума и уже только после этого установить прозрачный цвет. Например, у Вас полноцветное изображение – миллионы оттенков. Вы хотите сделать какой-то цвет прозрачным, сделать прозрачной область. Но на самом деле все пиксели нужного вам цвета в этой области не равны друг другу по значениям RBG, а отличаются друг от друга на несколько значений. Для глаза эти отличия незаметны. И если вы не ужмете палитру, то назначив какой-либо цвет прозрачным, Вы сделаете прозрачными лишь несколько пикселей.

Чтобы уменьшить разброс цветовой гаммы и привести значения близких цветов к одному единственному и применяется функция imagetruecolortopalette().

   
 
 автор: СерегаВЕБ   (31.01.2006 в 19:18)   письмо автору
12.3 Кб
 
   для: glsv (Дизайнер)   (31.01.2006 в 00:33)
 

Так а мне как раз и надо сделать прозрачный только 1 из миллионов прозрачным, которым я специально закрасил область на шаблоне (шаблон содержит прозрачные цвета, через которые будет видно картинку под ним, и розовый цвет, который закроет края картики). Если при сокращении цветов этот цвет совпадет с каким-то с самой картинки, то в нейбудут дырки.

Результат в 34.zip, который получился так Kitten.jpg + shablon.png - розовый цвет = 8.gif

   
 
 автор: glsv (Дизайнер)   (31.01.2006 в 23:56)   письмо автору
 
   для: СерегаВЕБ   (31.01.2006 в 19:18)
 

> Так а мне как раз и надо сделать прозрачный только 1 из миллионов прозрачным
Я немного про другое. Вы закрасили область на шаблоне однородным цветом, но не факт, что эта область после сохранения результата в файл осталась такой же однородной. Если сохраняете в JPEG, то скорее всего нет, т.к. JPEG сохраняет с потерей качества. Там миллионы оттенков. И ваша, казалось бы, однородная область на самом деле состоит из тысяч оттенков. А Вы назначаете прозрачным только один оттенок, а другие тысячи не трогаете. Поэтому и результата не видно.

> Если при сокращении цветов этот цвет совпадет с каким-то с самой картинки, то в нейбудут дырки.
Это возможно если очень сильно сжимать палитру. Нужно экспериментировать и искать компромисс.

Хотя, скорее всего, именно в Вашем случае главную роль играет другой момент.
Imagecolortransparent() может создавать только полностью прозрачнее пиксели, а значит результат ее работы предназначена вывода в форматы GIF и PNG-8. Оба этих формата поддерживает только 256 цветов.
Отсюда можно сделать вывод: для того, чтобы применять функцию Imagecolortransparent() к изображению нужно его предварительно переформатировать из полноцветного в изображение с палитрой, которая содержит не более 256 цветов.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования