Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Водяной знак с полупрозрачностью

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Описание: Решаем проблему совмещения GIF и PNG файлов
Novascriptum
Отправлено: 27 Октября, 2013 - 15:48:50
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Приветствую всех, кто проявил внимание к теме!

Столкнулся с простой, на первый взгляд, задачей, в процессе решения которой возникли непредвиденные осложнения. Как, впрочем, и всегда. Радость
Задача: проставить на изображение [основу] (jpg / gif / png) водяной знак (gif / png) с полупрозрачностью.
Особенности:
1) Основа может иметь прозрачный фон.
2) Водяной знак, естественно, имеет прозрачный фон.
3) Водяному знаку нужно добавить полупрозрачность.
4) Результирующее изображение можно делать в формате PNG, если на входе GIF (если это облегчит задачу).

Для двух PNG изображений задача решается функцией imagecopymerge_alpha, написанной Родриго Поло и опубликованной на официальном сайте PHP: http://www.php.net/manual/en/fun...agecopymerge.php (нужно немного промотать вниз).

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

Есть ли у вас мысли на этот счет?
 
 Top
deblogger
Отправлено: 01 Ноября, 2013 - 09:41:40
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)

[+]


Потому что GIF не несет с собой альфа-канала. Следовательно этот формат сперва надо особо конвертануть в RGBA.
(Добавление)
Откуда у вас вообще берутся такие gif'ы? Если берутся - ищите функцию которая может их конвертить.

В общих чертах гиф устроен просто. Это массив индексов указывающих на поллитру в которой лежат RGB (8*3, TrueColor) пикселы. Такая хитромудрая система порождена в свое время особенностями харда. Один из таких пикселов в палитре может быть обозначен как "прозрачный". Коню ясно это не пиксел альфаканала, это просто метка, инструкция рендеру: все пикселы которые показывают на этот цвет рендерить пикселами фона. Посклольку никаких коэффициентов не предусмотрено, то рендерится либо пиксел изображения, либо пиксел фона, что приводит к известному при определенных обстоятельствах эффекту бахромы.

Конвертер фактически должен построить альфу по этим самым индексам. Заменив индексы на те самые пикселы из палитры. Можно даже самому написать.

Кстати, в автодесковой реализации гиф мог сдвигать свою палитру во времени. Не сам, но хранилась в нем такая инструкция которая будучи поддержана ПО позволяла анимировать гиф без анимации.

И да, вскрывая гиф вам еще надо об этой самой анимации позаботиься. Короче гемор. Откажитесь от гифа - это проще.
 
 Top
Novascriptum
Отправлено: 03 Ноября, 2013 - 19:17:49
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




Цитата:
Откажитесь от гифа - это проще

Хорошо, бог с ним, с gif'ом, если в нем основа изображения. Но вот водяной знак gif, как я понимаю, можно конвертнуть в rgba без потери качества и нанести на png / jpeg?
 
 Top
deblogger
Отправлено: 05 Ноября, 2013 - 04:25:02
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)

[+]


Можно, но как это сделать встроенными функциями я не понял. Готовых решений нет, это значит либо все делается обычно, либо вообще не делается. Надо проверять.

Вы можете открыть файл как байтовый массив и согласно спецификации на gif размочить его.
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Ноября, 2013 - 11:40:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Реализация (Отобразить)


Пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. // Основной холст
  3. $imagePNG = new Image('sample.png');
  4. // Водяной знак
  5. $imageGIF = new Image('sample.gif');
  6.  
  7. $x = $imagePNG->width - $imageGIF->width - 20;
  8. $y = $imagePNG->height - $imageGIF->height - 20;
  9.  
  10. $imagePNG->copy($imageGIF->opacity(0.7), $x, $y)->outputType(IMAGETYPE_PNG);
  11.  
  12.  
  13. echo $imagePNG;
  14.  


P.S. Решение реализовано подобным образом, чтобы его можно было расширить другим функционалом.

Примечание:
Конструктор класса может принимать несколько вариантов аргументов:
либо имя файла,
либо ресурс изображения,
либо 3 аргумента: ширина, высота и массив rgbа(rgb)-цветов для генерации изображения.
В последнем случае третий аргумент не обязателен.
Если не указывать, то сгенерируется прозрачный холст.

Для сохранение изображения в нужном формате просто укажите соответствующее расширение.

(Отредактировано автором: 10 Ноября, 2013 - 17:15:33)

 
 Top
esterio
Отправлено: 05 Ноября, 2013 - 12:18:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




armancho7777777
Какая лицензия класса? Можно забрать себе на использование?
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Ноября, 2013 - 12:51:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Да пожалуйста.
Написал за 20 минут, выложил.

У меня мега либа лежит на доработке,
как закончу её, а также офф.страницу с доками и примерами,
выложу на форуме ссылку.
Уступает только imagick'у c gmagick'ом ))
 
 Top
deblogger
Отправлено: 05 Ноября, 2013 - 14:49:52
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)

[+]


Это оно и есть - преобразование gif'89 в RGBA?
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Ноября, 2013 - 14:54:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




deblogger, я не понимаю о чём Вы пишите в своих сообщениях.
Я решил задачу, которая стояла перед автором темы.
 
 Top
deblogger
Отправлено: 05 Ноября, 2013 - 15:02:27
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)

[+]


Стало быть делается как обычно, а автор темы чего-то там перемудрил в компании Родриго Поло.
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Ноября, 2013 - 15:04:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




deblogger пишет:
Стало быть делается как обычно

"Как обычно", это как ?
 
 Top
deblogger
Отправлено: 05 Ноября, 2013 - 15:25:21
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)

[+]


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

Кстати, пытаясь понять что там вообще делается смутно вспомнил и проверка показала что вспомнил розовую плашку правильно, а именно

Цитата:
Warning

You cannot throw an exception from within a __toString() method. Doing so will result in a fatal error.


Придется вам вынуть save() из волшебного метода.
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Ноября, 2013 - 15:49:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




deblogger пишет:
Придется вам вынуть save() из волшебного метода.

Не думаю.
(Добавление)
deblogger пишет:
но если у вас оно работает - то есть кладет "прозрачный" гиф на "прозрачный" гиф и сохраняет в "прозрачном" гифе - значит обычно так и делают.

Безупречный ответ.
 
 Top
deblogger
Отправлено: 05 Ноября, 2013 - 16:05:47
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)

[+]


Ну да, надо поменять исключения на вызов функции http://php.net/manual/en/functio...rigger-error.php

Я вообще искал среди волшебных методов такой, который бы позволил складывать объекты обычным путем. Скажем $ImagePNG = $ImagePNG + $ImageGIF. Что позволило бы и умножать: $ImagePNG = $ImagePNG + $ImageGIF * 0.25. Предварительно вписав в проперть штампа положение его в пространстве документа: $ImageGIF->bottom('right') например, или наоборот ImageGIF->right('bottom'), или слева ImageGIF->left('bottom'), а по умолчанию - посредине середины что идеально для водяных знаков. Кроме того поля удобно внести заранее чем париться расчетами $ImageGIF->margin(20); $ImageGIF->margin(10, 20) задает для двух полей - горизонтального и вертикального. Названия полям давать нельзя, потому что в зависимости от выравнивания они поменяются логически. Было поле левое - станет правое.

Так вот, и не нашел. Такое вообще возможно реализовать - плюсовать объекты?
 
 Top
armancho7777777 Супермодератор
Отправлено: 05 Ноября, 2013 - 16:10:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




deblogger пишет:
Ну да, надо поменять исключения на вызов функции

Нет. Всё работает отлично.
Советую перепроверить.

deblogger пишет:
Кроме того поля удобно внести заранее чем париться расчетами $ImageGIF->margin(20); $ImageGIF->margin(10, 20) задает для двух полей - горизонтального и вертикального.


Читаем в чём заключался вопрос автора.
А в остальном:
armancho7777777 пишет:
Решение реализовано подобным образом, чтобы его можно было расширить другим функционалом.


Во-вторых, мне лично это не интересно, так-как:
armancho7777777 пишет:
У меня мега либа лежит на доработке,
как закончу её, а также офф.страницу с доками и примерами,
выложу на форуме ссылку.
Уступает только imagick'у c gmagick'ом ))
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Графика в PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB