Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение прозрачности изображения, Задать ХХ% прозрачность изображению в GD 
V
    Опции темы
voidman
Дата 12.11.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Здравствуйте!

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

Есть любое изображение. Нужно сделать из него прозрачный 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;        
 }


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

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


PM MAIL   Вверх
skyboy
Дата 12.11.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Цитата(voidman @  12.11.2008,  09:27 Найти цитируемый пост)
То есть, "мое прозрачное изображение наложено на серый фон", а не полностью прозрачно.

небось, смотришь через IE, который без танцев с бубном не понимает полупрозрачные PNG?
PM MAIL   Вверх
voidman
Дата 12.11.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Да нет. 
Смотрю через FF. Тестируемое изображение накладываю на "div" c  клетчатым фоном как в фотошопе.
Для полной уверенности - сохраняю изображние на диск и смотрю через фотошоп.

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

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

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  example.jpg 76,25 Kb
PM MAIL   Вверх
skyboy
Дата 12.11.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



может, давай полностью приведешь код - до момента сохранения в файл?

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

Добавлено через 6 минут и 36 секунд
*угадывания продолжаются* не найду информацию о логике работы imagesavealpha - модифицирует ли функция ресурс графики или же только обрабаывает цветовую информацию... во втором случае потребовалось бы вызывать imagesavealpha не после открытия, а перед сохранением... Ну, во всяком случае - после imagecopymerge
PM MAIL   Вверх
voidman
Дата 12.11.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Ладно, не гадай smile

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

Код

<?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 )

Это сообщение отредактировал(а) voidman - 12.11.2008, 15:07
PM MAIL   Вверх
skyboy
Дата 12.11.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



люди советуют использовать imagecopy. сходу у меня с imagecopymerge вопрос решить не удалось...
PM MAIL   Вверх
voidman
Дата 12.11.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Уже решил эту проблему. Выкрутил код со старого срипта для построения отражения

Надеюсь, кто-то избавится от многочасовой головной боли (как я) 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, спасибо за участие!
PM MAIL   Вверх
skyboy
Дата 12.11.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



ну, вот. и твое "решение" отличается от "вопроса" отличается использованием imagecopy вместо imagecopymerge smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.