Скорая Компьютерная Помощь г. Калуга

Полный спектр компьютерных услуг!

Здравствуйте, гость ( Вход | Регистрация )

> Внимание!

  • Вся информация, расположенная в данном и других разделах форума получена из открытых источников (интернет-ресурсы, средства массовой информации, печатные издания и т.п.) и/или добавлена самими пользователями. Администрация форума предоставляет его участникам площадку для общения / размещения файлов / статей и т.п. и не несет ответственности за содержание сообщений, а также за возможное нарушение авторских, смежных и каких-либо иных прав, которое может повлечь за собой информация, содержащаяся в сообщениях.
 
Ответить в эту темуОткрыть новую тему
> PHP / [Из песочницы] Как убрать watermark с картинки
Decker
сообщение 21.12.2011, 22:02
Сообщение #1


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1







Есть различные способы, как убрать watermark с картинки:

1) Методом photoshop — для кропотливых людей и знающих как это сделать в редакторе

2) Методом сторонних программ — приложение просто замажет его, в целом останутся «рубцы»

3) Метод DYI on {язык программирования} — т.е. мы сами пишем велосипед, что бы почистить изображение



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





По работе столкнулся с задачей по стиранию watermark с изображений. Изображений много, около 1000.

Значит нужно средство по автоматизации данной процедуры. Немного поразмыслив, пришёл к выводу что:

1) При наложении watermark, происходят математические преобразования цвета

2) Если у watermark есть прозрачность, то можно обратить цвет в исходный



Как это сделать?

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



А что делать, если нет маски?

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

2) С помощью нескольких изображений, программными методами, создать маску ( тема другой статьи )



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



Важные моменты:

1) Если в маске есть не прозрачный пиксель, он перейдёт на конечное изображение

2) Ширина и высота маски и исходного изображения для упращения одинаковы



Теория и формулы:

1) Цвет пикселя при наложении watermark рассчитывается следующим образом ( упрощённый вариант )

dist = ( sour + ( mask — sour ) * alpha, где

dist — конечный цвет пикселя ( от 0 до 255 )

sour – исходный цвет пикселя до наложения watermark

mask – цвет пикселя watermark

alpha – уровень прозрачности. От 0(полностью прозрачно) до 1(полностью непрозрачно)



2) Формула обратного преобразования цвета

sour = ( dist — 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];

// Создаем изображение, куда будет копировать конечно изображение
$dist = 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($dist, $x, $y, $pixelcolor);
}
}

// Сохраняем чистое изображение
imagejpeg($dist, $saveFile);
imagedestroy($dist);


/**
* Обращает цвет вотермарка в исходный цвет
* @param integer $pDist Цвет вотермарка
* @param integer $pMask Цвет маски
* @param float $pAlpha уровень прозрачности. От 0(полностью прозрачно) до 1(полностью непрозрачно)
* @return integer
*/
function unBlend( $pDist, $pMask, $pAlpha ){
$color = $pMask;
// Если $pMask == 1, то обратить не получится
if ( $pAlpha != 1 ){
// Обратная формула от формулы наложения вотермарка ( dist = ( sour + ( mask - sour ) * alpha )
$color = ( $pDist - $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 );
}

?>

Original source: habrahabr.ru (comments, light).

Читать дальше


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 7.7.2025, 6:31
Яндекс цитирования