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 :: Водяной знак с полупрозрачностью
Покинул форум
Сообщений всего: 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, мне не удается добиться нужного эффекта: водяной знак становится полностью черным или видна какая-то его часть (без полупрозрачности).
Есть ли у вас мысли на этот счет?
deblogger
Отправлено: 01 Ноября, 2013 - 09:41:40
Новичок
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
[+]
Потому что GIF не несет с собой альфа-канала. Следовательно этот формат сперва надо особо конвертануть в RGBA. (Добавление)
Откуда у вас вообще берутся такие gif'ы? Если берутся - ищите функцию которая может их конвертить.
В общих чертах гиф устроен просто. Это массив индексов указывающих на поллитру в которой лежат RGB (8*3, TrueColor) пикселы. Такая хитромудрая система порождена в свое время особенностями харда. Один из таких пикселов в палитре может быть обозначен как "прозрачный". Коню ясно это не пиксел альфаканала, это просто метка, инструкция рендеру: все пикселы которые показывают на этот цвет рендерить пикселами фона. Посклольку никаких коэффициентов не предусмотрено, то рендерится либо пиксел изображения, либо пиксел фона, что приводит к известному при определенных обстоятельствах эффекту бахромы.
Конвертер фактически должен построить альфу по этим самым индексам. Заменив индексы на те самые пикселы из палитры. Можно даже самому написать.
Кстати, в автодесковой реализации гиф мог сдвигать свою палитру во времени. Не сам, но хранилась в нем такая инструкция которая будучи поддержана ПО позволяла анимировать гиф без анимации.
И да, вскрывая гиф вам еще надо об этой самой анимации позаботиься. Короче гемор. Откажитесь от гифа - это проще.
Novascriptum
Отправлено: 03 Ноября, 2013 - 19:17:49
Новичок
Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2013
Помог: 0 раз(а)
Цитата:
Откажитесь от гифа - это проще
Хорошо, бог с ним, с gif'ом, если в нем основа изображения. Но вот водяной знак gif, как я понимаю, можно конвертнуть в rgba без потери качества и нанести на png / jpeg?
deblogger
Отправлено: 05 Ноября, 2013 - 04:25:02
Новичок
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
[+]
Можно, но как это сделать встроенными функциями я не понял. Готовых решений нет, это значит либо все делается обычно, либо вообще не делается. Надо проверять.
Вы можете открыть файл как байтовый массив и согласно спецификации на gif размочить его.
armancho7777777
Отправлено: 05 Ноября, 2013 - 11:40:13
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
P.S. Решение реализовано подобным образом, чтобы его можно было расширить другим функционалом.
Примечание:
Конструктор класса может принимать несколько вариантов аргументов:
либо имя файла,
либо ресурс изображения,
либо 3 аргумента: ширина, высота и массив rgbа(rgb)-цветов для генерации изображения.
В последнем случае третий аргумент не обязателен.
Если не указывать, то сгенерируется прозрачный холст.
Для сохранение изображения в нужном формате просто укажите соответствующее расширение.
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
armancho7777777
Какая лицензия класса? Можно забрать себе на использование?
armancho7777777
Отправлено: 05 Ноября, 2013 - 12:51:44
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Да пожалуйста.
Написал за 20 минут, выложил.
У меня мега либа лежит на доработке,
как закончу её, а также офф.страницу с доками и примерами,
выложу на форуме ссылку.
Уступает только imagick'у c gmagick'ом ))
deblogger
Отправлено: 05 Ноября, 2013 - 14:49:52
Новичок
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
[+]
Это оно и есть - преобразование gif'89 в RGBA?
armancho7777777
Отправлено: 05 Ноября, 2013 - 14:54:29
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
deblogger, я не понимаю о чём Вы пишите в своих сообщениях.
Я решил задачу, которая стояла перед автором темы.
deblogger
Отправлено: 05 Ноября, 2013 - 15:02:27
Новичок
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
[+]
Стало быть делается как обычно, а автор темы чего-то там перемудрил в компании Родриго Поло.
armancho7777777
Отправлено: 05 Ноября, 2013 - 15:04:36
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
deblogger пишет:
Стало быть делается как обычно
"Как обычно", это как ?
deblogger
Отправлено: 05 Ноября, 2013 - 15:25:21
Новичок
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013
Помог: 0 раз(а)
[+]
Понятия не имею как обычно оперируют гифами с "прозрачным" цветом, но если у вас оно работает - то есть кладет "прозрачный" гиф на "прозрачный" гиф и сохраняет в "прозрачном" гифе - значит обычно так и делают.
Кстати, пытаясь понять что там вообще делается смутно вспомнил и проверка показала что вспомнил розовую плашку правильно, а именно
Цитата:
Warning
You cannot throw an exception from within a __toString() method. Doing so will result in a fatal error.
Придется вам вынуть save() из волшебного метода.
armancho7777777
Отправлено: 05 Ноября, 2013 - 15:49:41
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
deblogger пишет:
Придется вам вынуть save() из волшебного метода.
Не думаю. (Добавление)
deblogger пишет:
но если у вас оно работает - то есть кладет "прозрачный" гиф на "прозрачный" гиф и сохраняет в "прозрачном" гифе - значит обычно так и делают.
Безупречный ответ.
deblogger
Отправлено: 05 Ноября, 2013 - 16:05:47
Новичок
Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2013
Я вообще искал среди волшебных методов такой, который бы позволил складывать объекты обычным путем. Скажем $ImagePNG = $ImagePNG + $ImageGIF. Что позволило бы и умножать: $ImagePNG = $ImagePNG + $ImageGIF * 0.25. Предварительно вписав в проперть штампа положение его в пространстве документа: $ImageGIF->bottom('right') например, или наоборот ImageGIF->right('bottom'), или слева ImageGIF->left('bottom'), а по умолчанию - посредине середины что идеально для водяных знаков. Кроме того поля удобно внести заранее чем париться расчетами $ImageGIF->margin(20); $ImageGIF->margin(10, 20) задает для двух полей - горизонтального и вертикального. Названия полям давать нельзя, потому что в зависимости от выравнивания они поменяются логически. Было поле левое - станет правое.
Так вот, и не нашел. Такое вообще возможно реализовать - плюсовать объекты?
armancho7777777
Отправлено: 05 Ноября, 2013 - 16:10:56
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
deblogger пишет:
Ну да, надо поменять исключения на вызов функции
Нет. Всё работает отлично.
Советую перепроверить.
deblogger пишет:
Кроме того поля удобно внести заранее чем париться расчетами $ImageGIF->margin(20); $ImageGIF->margin(10, 20) задает для двух полей - горизонтального и вертикального.
Читаем в чём заключался вопрос автора.
А в остальном:
armancho7777777 пишет:
Решение реализовано подобным образом, чтобы его можно было расширить другим функционалом.
Во-вторых, мне лично это не интересно, так-как:
armancho7777777 пишет:
У меня мега либа лежит на доработке,
как закончу её, а также офф.страницу с доками и примерами,
выложу на форуме ссылку.
Уступает только imagick'у c gmagick'ом ))
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.