|
 18.9 Кб |
|
| Проблемка есть, как сделать заливку разными цветами, вот этого изображения с прозрачным фоном. Желательно пример кода | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: confirm
(21.01.2013 в 18:33)
| | а можно подобное сделать на JS? в вашем примере я так понял придется на сервер отправлять изображение | |
|
|
|
|
|
|
|
для: technic611
(17.02.2013 в 16:18)
| | Нет, с помощью JS этого сделать нельзя. На клиенте можно сделать только браузером имеющем поддержку canvas из HTML5. | |
|
|
|