Меню сайта |
|
 |
Мини-чат |
|
 |
Наш опрос |
|
 |
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
 |
Форма входа |
|
 |
|
Главная » 2014 » Февраль » 13 » Как убрать watermark с картинки
|
|
|
Как убрать 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 |
|
|
Поиск |
|
 |
Календарь |
|
 |
Архив записей |
|
 |
|