Суббота, 21.06.2025, 19:54
Приветствую Вас Гость | RSS
 
Мой сайт
Главная | | Регистрация | Вход
Меню сайта

Мини-чат

Наш опрос
Оцените мой сайт
Всего ответов: 0

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » 2014 » Февраль » 13 » Как убрать watermark с картинки
15:12
 

Как убрать watermark с картинки

21 декабря 2011 в 22:02

Как убрать watermark с картинки из песочницы



Есть различные способы, как убрать watermark с картинки:
1) Методом photoshop — для кропотливых людей и знающих как это сделать в редакторе
2) Методом сторонних программ — приложение просто замажет его, в целом останутся «рубцы»
3) Метод DIY on {язык программирования} — т.е. мы сами пишем велосипед, что бы почистить изображение

Под катом, как это сделать и пример кода


По работе столкнулся с задачей по стиранию watermark с изображений. Изображений много, около 1000.
Значит нужно средство по автоматизации данной процедуры. Немного поразмыслив, пришёл к выводу что:
1) При наложении watermark, происходят математические преобразования цвета
2) Если у watermark есть прозрачность, то можно обратить цвет в исходный

Как это сделать?
Нужно иметь исходную маску watermark.

А что делать, если нет маски?
1) Большинство масок это обычный текст с полупрозрачностью, т.е. методом простого тыка, находится нужная маска
2) С помощью нескольких изображений, программными методами, создать маску ( тема другой статьи )

В данном случаем мы разбираем только обратное преобразование ( формулы, работы с прозрачностью PNG и т.п. )

Важные моменты:
1) Если в маске есть не прозрачный пиксель, он перейдёт на конечное изображение
2) Ширина и высота маски и исходного изображения для упрощения одинаковы

Теория и формулы:
1) Цвет пикселя при наложении watermark рассчитывается следующим образом ( упрощённый вариант )
dest = ( sour + ( mask — sour ) * alpha, где
dest — конечный цвет пикселя ( от 0 до 255 )
sour – исходный цвет пикселя до наложения watermark
mask – цвет пикселя watermark
alpha – уровень прозрачности. От 0(полностью прозрачно) до 1(полностью непрозрачно)

2) Формула обратного преобразования цвета
sour = ( dest — alpha * mask ) / ( 1 — alpha )
со школы помним, что знаменатель не может быть равным 0. В нашем случае мы не может восстановить цвет исходного пикселя, если цвет пикселя у маски был без прозрачности

3) При считывании маски с формата PNG, имеем иную логику
Если прозрачность пикселя в маске равна 127, то пиксель считается полностью прозрачным
Если прозрачность пикселя в маске равна 0, то пиксель считается полностью не прозрачным
Формула преобразования прозрачности:
abs( ( (RGB >> 24) & 0xFF ) / 127 — 1)

Файлы:
Файл с наложенным watermark-ом
Файл watermark-a
Чистый файл, уже без watermark


Итого внизу исходный код на PHP:

<?php // Исходное изображение $sourFile = 's.jpg'; // Маска-watermark $maskFile = 'm.png'; // Конечное изображение $saveFile = 'd.jpg'; // Открываем исходное изображение $sour = imageCreateFromJpeg($sourFile); // Открываем маску $mask = imageCreateFromPng($maskFile); // Получаем высоту и ширину изображения $imgSize = getImageSize($sourFile); $imgWidth = $imgSize[0]; $imgHeight = $imgSize[1]; // Создаем изображение, куда будет копировать конечно изображение $dest = imageCreateTrueColor($imgWidth, $imgHeight); // Бегаем по высоте for ($y = 0; $y < $imgHeight; $y++) { // Бегаем по ширине for ($x = 0; $x < $imgWidth; $x++) { // Получаем цвета пикселя с вотермарка $SourRgb = getPixColor($sour, $x, $y); // Получаем цвета пикселя с маски $MaskRgb = getPixColor($mask, $x, $y); // Обращаем цвет RBG в обратную строну $red = unBlend($SourRgb['r'], $MaskRgb['r'], $MaskRgb['a']); $green = unBlend($SourRgb['g'], $MaskRgb['g'], $MaskRgb['a']); $blue = unBlend($SourRgb['b'], $MaskRgb['b'], $MaskRgb['a']); // Соединяем цвета в формат RGB $pixelcolor = ( $red << 16 ) | ( $green << 8 ) | $blue ; imagesetpixel($dest, $x, $y, $pixelcolor); } } // Сохраняем чистое изображение imagejpeg($dest, $saveFile); imagedestroy($dest); /** * Обращает цвет вотермарка в исходный цвет * @param integer $pDest Цвет вотермарка * @param integer $pMask Цвет маски * @param float $pAlpha уровень прозрачности. От 0(полностью прозрачно) до 1(полностью непрозрачно) * @return integer */ function unBlend( $pDest, $pMask, $pAlpha ){ $color = $pMask; // Если $pMask == 1, то обратить не получится if ( $pAlpha != 1 ){ // Обратная формула от формулы наложения вотермарка ( dest = ( sour + ( mask - sour ) * alpha ) $color = ( $pDest - $pAlpha * $pMask ) / ( 1 - $pAlpha ); // Не выходим ли мы запределы 0..255 $color = $color < 0 ? 0 : round($color); $color = $color > 255 ? 255 : $color; } return $color; } /** * Получаем цвет пикселя с прозрачностью. * Возвращает в формате array('r'=>int, 'g'=>int, 'b'=>int, 'a'=>float); * @param gdImage $pImage Handle на изображение * @param integer $pX позиция по X * @param integer $pY позиция по Y * @return array */ function getPixColor($pImage, $pX, $pY){ // Получаем цвет изображения $rgb = imagecolorat($pImage, $pX, $pY); // Преобразуем $red = ($rgb >> 16) & 0xFF; $green = ($rgb >> 8) & 0xFF; $blue = $rgb & 0xFF; // Преобразуем alpha, так как в PNG 127 это полная прозрачность, а 0 - не прозрачность $alpha = abs(( ($rgb >> 24) & 0xFF ) / 127 - 1); return array('r'=>$red, 'g'=>$green, 'b' => $blue, 'a' => $alpha ); } ?>
Просмотров: 6647 | Добавил: yourif | Рейтинг: 0.0/0
Всего комментариев: 0
Поиск

Календарь
«  Февраль 2014  »
Пн Вт Ср Чт Пт Сб Вс
     12
3456789
10111213141516
17181920212223
2425262728

Архив записей

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz


  • Copyright MyCorp © 2025

    Сделать бесплатный сайт с uCoz