Изменение прозрачности изображения

 
0
 
PHP
ava
voidman | 12.11.2008, 10:27
Здравствуйте!

Помогите, пожалуйста, решить задачу.

Есть любое изображение. Нужно сделать из него прозрачный PNG средствами ГД.
То есть - задаю значение 40% и на выходе уже прозрачная картинка.

Все попытки увенчались провалом.
Вот мой "неудачный" код:



public function change_opacity($opacityVal)
{

$final_img = imagecreatetruecolor($this->img_width, $this->img_height);

imagesavealpha($final_img, true);
imagealphablending($final_img, false);

$color = imagecolortransparent($final_img);

// создание полностью прозрачной подкладки для imagecopymerge
imagefilledrectangle($final_img, 0, 0, $this->img_width, $this->img_height, $color);


// Миграция 2 картинок с "якобы" заданой величиной прозрачности $opacityVal
imagecopymerge($final_img, $this->img, 0, 0, 0, 0,$this->img_width, $this->img_height, $opacityVal);


$this->img = $final_img;

return true;
}


Результат: изображение выходит "псевдопрозрачным". То есть, "мое прозрачное изображение наложено на серый фон", а не полностью прозрачно.

Оргомное спасибо за помощь!

Ответы (7)
ava
skyboy | 12.11.2008, 13:03 #
Цитата (voidman @ 12.11.2008, 09:27 findReferencedText)
То есть, "мое прозрачное изображение наложено на серый фон", а не полностью прозрачно.

небось, смотришь через IE, который без танцев с бубном не понимает полупрозрачные PNG?
ava
voidman | 12.11.2008, 13:46 #
Да нет.
Смотрю через FF. Тестируемое изображение накладываю на "div" c клетчатым фоном как в фотошопе.
Для полной уверенности - сохраняю изображние на диск и смотрю через фотошоп.

Для теста пробовал просто вывести прозрачную подложку (давал ей 50% прозрачности) - на мой тестовый фон. Правильно выводилось полупрозрачное сероватое изображение. Но после миграции - проблема описанная выше.

На картинке (все выведено через FireFox):
А - исходное изображение
B - то, что выходит у меня
С - вывел картинку с прозрачностью, сделанную в фотошопе
ava
skyboy | 12.11.2008, 14:52 #
может, давай полностью приведешь код - до момента сохранения в файл?

Добавлено позднее:
*немного погадаю* а $this->img, который накладываешь - для него прозрачность используется? ну, эти savealhpa, alphablending вызывались?

Добавлено позднее:
*угадывания продолжаются* не найду информацию о логике работы imagesavealpha - модифицирует ли функция ресурс графики или же только обрабаывает цветовую информацию... во втором случае потребовалось бы вызывать imagesavealpha не после открытия, а перед сохранением... Ну, во всяком случае - после imagecopymerge
ava
voidman | 12.11.2008, 15:06 #
Ладно, не гадай :)

"Уменьшенная" но точная копия моего большого кода (работает аналогично):


<?php

$opacityVal = 50;

$src_img = imagecreatefrompng('example.png');
$scr_w = imagesx($src_img);
$scr_h = imagesy($src_img);

imagesavealpha($src_img, true);
imagealphablending($src_img, true);

$final_img = imagecreatetruecolor($scr_w, $scr_h);

imagesavealpha($final_img, true);
imagealphablending($final_img, false);

$color = imagecolortransparent($final_img);

imagefilledrectangle($final_img, 0, 0,$scr_w, $scr_h, $color);

imagecopymerge($final_img, $src_img, 0, 0, 0, 0,$scr_w, $scr_h, $opacityVal);

$src_img = $final_img;


header("Content-Type: image/png");
imagepng($src_img);

?>


Ее можно с уверенностью запускать и протестировать на localhoste )
ava
skyboy | 12.11.2008, 16:12 #
люди советуют использовать imagecopy. сходу у меня с imagecopymerge вопрос решить не удалось...
ava
voidman | 12.11.2008, 16:21 #
Уже решил эту проблему. Выкрутил код со старого срипта для построения отражения

Надеюсь, кто-то избавится от многочасовой головной боли (как я) smile
Вот работающий код, позволяющий сделать изображение прозрачным на ХХ процентов:


$opacityVal = 50; // В процентах

$src_img = imagecreatefrompng('example.png');
$scr_w = imagesx($src_img);
$scr_h = imagesy($src_img);

$output = imagecreatetruecolor($scr_w, $scr_h);
$buffer = imagecreatetruecolor($scr_w, $scr_h);

imagesavealpha($src_img, true);

imagesavealpha($output, true);
imagealphablending($output, false);

imagesavealpha($buffer, true);
imagealphablending($buffer, false);

imagecopy($output, $src_img, 0, 0, 0, 0,$scr_w, $scr_h);
for ($y = 0; $y < $scr_h; $y++)
{
imagecopy($buffer, $output, 0, $y, 0, $y, $scr_w, 1);
}

$output = $buffer;

imagelayereffect($output, IMG_EFFECT_OVERLAY);

$final_alpha = 127 - ceil($opacityVal/(100/127));

for ($y = 0; $y <= $scr_h; $y++)
{
imagefilledrectangle($output, 0, $y, $scr_w, $y, imagecolorallocatealpha($output, 128, 128, 128, $final_alpha));
}

$src_img = $output;



header("Content-Type: image/png");
imagepng($src_img);


skyboy, спасибо за участие!
ava
skyboy | 12.11.2008, 17:12 #
ну, вот. и твое "решение" отличается от "вопроса" отличается использованием imagecopy вместо imagecopymerge smile
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  skyboy   voidman
advanced
Отправить