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

Форум PHP

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

 

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

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

тема: Поменять заливку изображения
 
 автор: technic611   (21.01.2013 в 14:13)   письмо автору
18.9 Кб
 
 

Проблемка есть, как сделать заливку разными цветами, вот этого изображения с прозрачным фоном. Желательно пример кода

  Ответить  
 
 автор: confirm   (21.01.2013 в 18:33)   письмо автору
 
   для: technic611   (21.01.2013 в 14:13)
 

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

Изменять цвет непосредственно в RGB формате довольно таки сложно, поэтому изменять цвет лучше в формате HSB. Для этого полученный цвет индекса палитры конвертируется в HSB, затем изменяется его компонента H - от установленного значения (от 0 до 350) отнимается H. Таким образом будет изменяться цветовой оттенок. Насыщенность при этом не изменяется, и равна исходному.

Затем производится обратное преобразование (HSB в RGB) и этот полученный цвет устанавливается ячейке палитры. Перебрав всю палитру, за исключением прозрачной ячейки (ячейка определяющая прозрачный цвет) и определим новый цвет изображению - новый цветовой оттенок его. При этом потребуется максимум 256 итераций цикла, если изображение будет иметь такую палитру. Для данного изображения это слишком много, максимум для него это 64 цвета, что нужно определить изначально, при подготовке этого изображения в редакторе. Кстати, если изображение будет накладываться на белый фон, то лучше вообще отказаться от прозрачности, или задать прозрачным цветом белый цвет.

В полноцветном изображении (если у вас PHG24) такое проделать нельзя - изменять придется каждую ячейку изображения в отдельности.

Функций преобразований RGB в HSB, и HSB в RGB я приводить не буду, найдете их в сети, а сам код изменения цвета для изображения на палитре прост:
<?
$hue 
359//изменяя это значение от 0 до 359, изменяем оттенок изображения
$im imagecreatefrompng('image.png');
$transparent imagecolortransparent($im); //узнаем индекс прозрачного цвета в палитре
$total imagecolorstotal($im); //всего цветов в палитре изображения
//изменяем палитру изображения
for($i=0$i<$total$i++) {
   if(
$i != $transparent) { //если индекс не прозрачного цвета, то устанавливаем новый цвет индекса
      
$color array_values(array_diff_key(imagecolorsforindex($im$i), array('alpha'=>1))); //текущий цвет индекса
      
$color RGBtoHSB($color); //преобразуем RGB в HSB
      
$color[0] = abs($color[0]-$hue); //новый оттенок индексу
      
$color HSBtoRGB($color); //преобразуем HSB в RGB
      
imagecolorset($im$i$color[0], $color[1], $color[2]); //новый цвет индексу
   
}
}
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>

  Ответить  
 
 автор: technic611   (17.02.2013 в 16:18)   письмо автору
 
   для: confirm   (21.01.2013 в 18:33)
 

а можно подобное сделать на JS? в вашем примере я так понял придется на сервер отправлять изображение

  Ответить  
 
 автор: confirm   (17.02.2013 в 16:48)   письмо автору
 
   для: technic611   (17.02.2013 в 16:18)
 

Нет, с помощью JS этого сделать нельзя. На клиенте можно сделать только браузером имеющем поддержку canvas из HTML5.

  Ответить  
Rambler's Top100
вверх

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