Какой цвет в gif картинке является прозрачным?

korpus

злой бобёр
Какой цвет в gif картинке является прозрачным?

Мне необходимо уменьшать размеры gif-картинок перед загрузкой их на сервер. Для этого с помощью $new_image=imagecretate() (создаю именно палитровое изображение) создаю новое изображение с нужными размерами, а затем с помощью imagecopyresized (или imagecopyresampled) копирую исходное изображение в $new_image. При этом происходит потеря информации о прозрачности. Считаю что исправить это можносамому в новой картинке $new_image задав цвет, который должен быть прозрачным. Но как определить, какой цвет должен быть прозрачным? Пытался использовать imagesavealpha - это не помогает или же я просто не так её применял (я её применял после функции imagecopyresized к новому изображению $new_image).

Как можно узнать, какой цвет в исходной картинке обозначен как прозрачный, чтобы потом в новой картинке (с изменёнными размерами) можно было сделать его прозрачным с помощью функции imagecolortransparent.

Если кому-то известны другие способы изменения размеров изображений с сохранением информации о прозрачном цвете буду благодарен за информацию.
 

korpus

злой бобёр
А средствами php цвет, который обозначен как прозрачный, получить можно?
 

SiMM

Новичок
> А средствами php цвет, который обозначен как прозрачный, получить можно?
А что мешает?
 

no_santa

Снегур
imagecolorclosestalpha - получает индекс цвета, ближайшего к специфицированному, + alpha.
Описание
PHP:
int imagecolorclosestalpha (resource image, int red, int green, int blue, int alpha)
Возвращает индекс цвета палитры изображения, "ближайшего" к специфицированному RGB-значению, и уровень alpha.

См. также imagecolorexactalpha().

Примечание: эта функция была введена в PHP 4.0.6 и требует GD 2.0.1.
 

FractalizeR

Новичок
Автор оригинала: korpus
А средствами php цвет, который обозначен как прозрачный, получить можно?
Я немного не понял, чем вас не устраивает вызов GD imagecolorsforindex?

Еще можно воспользоваться imagecolortransparent. Без второго параметра она должна вернуть текущий прозрачный цвет.

no_santa
Насколько я могу судить, imagecolorclosestalpha здесь не поможет.
 

korpus

злой бобёр
Я использовал код, попытавшись записать прозрачный цвет в новое изображение (см. код ниже). В итоге места у картинки, которые были прозрачными, остались прозрачными. Но также прозрачными стали дополнительные части изображения, которые на исходом изображении были непрозрачными. Чтобы увидеть это я преобразовал сложную фотографию, на которой был изображён лес. Возможно здесь играет роль изменение палитры в результате работы функции imageCopyResized?

<?php
$im_tmp=createfromgif('picture.gif);
$im_new_tmp=imageCreate(300, 300);
imageCopyResized($im_new_tmp, $im_tmp, 0, 0, 0, 0, 300, 300, 400, 400); //размеры исходного изображения могут быть любыми и это не принципиально
$imm=imagecolorsforindex($im_tmp,imagecolortransparent($im_tmp));
imagecolortransparent($im_new_tmp, imagecolorclosest($im_tmp,$imm['red'],$imm['green'],$imm['blue']));
imageGif($im_new_tmp);
?>

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

<?php
$im_tmp=createfromgif('picture.gif);
$im_new_tmp=$im_tmp; //убрал создание нового изображения и убрал функцию imageCopyResized
$imm=imagecolorsforindex($im_tmp,imagecolortransparent($im_tmp));
imagecolortransparent($im_new_tmp, imagecolorclosest($im_tmp,$imm['red'],$imm['green'],$imm['blue']));
imageGif($im_new_tmp);
?>

Код почему-то не работает. Прозрачные области исходного изображения становятся белыми. Т.е. возможно способ получения цвета в палитре, который обозначен как прозрачный, из предыдущего скрипта я написал неправильный. Где может быть ошибка?
 

FractalizeR

Новичок
Я не силен в GD, но imagecolortransparent возвращает идентификатор цвета. А не его индекс в палитре.
 

Royal Flash

-=MaestrO=-
Для того, чтобы сделать прозрачный ресайз GIF, не нужно знать, какой цвет "прозрачный" - необходимо просто сделать прозрачной подложку:
PHP:
$old_src = imagecreatefromgif($src);
$new_img = imagecreate($width, $height);
$color = imagecolorallocate($new_img, 0, 0, 0); 
imagecolortransparent($new_img, $color); 
imagecopyresampled(($new_img, $old_src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagegif($new_img, $dest);
$width, $height - новый размер изображения, $size[0], $size[1] - размеры входящего фото, $src - путь к оригиналу, $dest - куда будет записано новое изображение. Причем обязательно использовать только для gif imagecreate(), а не imagecreatetruecolor()!
 
Сверху