<?php
for ($d=40;$d<41;$d+=1){
//chernaya fotka so znakom
$im=imagecreatefromjpeg("__1.jpg");
$s=array();
$c=0;
for ($i=1;$i<201;$i++){
if (!isset($s[$i])){
$s[$i]=array();
}
for ($j=1;$j<201;$j++){
$ic=imagecolorat($im,$i,$j);
if ($ic != 0){
$f=imagecolorsforindex ($im,$ic);
//var_dump($f);
//echo "<br>";
if ($f['red']>5 || $f['green']>5 || $f['blue']>5)
$s[$i][$j]=array('red'=>$f['red']*100/$d,'green'=>$f['green']*100/$d,'blue'=>$f['blue']*100/$d);
}
}
}
//fotka so znakom
$im=imagecreatefromjpeg("a.jpg");
for ($i=1;$i<201;$i++){
for ($j=1;$j<201;$j++){
if (is_array($s[$i][$j])){
$f=imagecolorsforindex ($im,imagecolorat($im,$i,$j));
$f=array('red'=>intval($s[$i][$j]['red']-($s[$i][$j]['red']-$f['red'])/(100-$d)*100),'green'=>intval($s[$i][$j]['green']-($s[$i][$j]['green']-$f['green'])/(100-$d)*100),'blue'=>intval($s[$i][$j]['blue']-($s[$i][$j]['blue']-$f['blue'])/(100-$d)*100));
if ($f['red']>255){
$f['red']=255;
}
if ($f['red']<0){
$f['red']=0;
}
if ($f['green']>255){
$f['green']=255;
}
if ($f['green']<0){
$f['green']=0;
}
if ($f['blue']>255){
$f['blue']=255;
}
if ($f['blue']<0){
$f['blue']=0;
}
$nc=imagecolorallocate($im,$f['red'],$f['green'],$f['blue']);
imagesetpixel($im,$i,$j,$nc);
}
}
}
imagejpeg($im,$d."a.jpg",100);
}
netwind: В примере с "SS" вам известна прозрачность и цвет был белый.
первая S не белая, а (50,100,150)
прикол в том, что при неизвестной прозрачности, её приходиться находить методом тупого перебора. сначала шаг в 5%, а потом по результатам шаг в 1% на заданом промежутке.
netwind: Если вы обрабатывали отдельно каждый канал R,G и B, то откуда искажение цветов взялось?
меня это тоже интересует, но уже не настолько, чтобы я начал искать причину:)
П.С. одна из возможных причин это то, что скрипт сейчас довольно топорный: ни проверки на ошибки, ни проверки на крайности(0,255)
П.П.С. так оно и есть. после проверки получается это
ну что, подтверждается поговорка: язык мой - враг мой :)
а конкретно "водяной знак любой сложности".
большие по площади знаки удаляются без проблем, но вот на краях или на тонких линиях начинаются проблемы, потому что все библиотеки начинают "оптимизировать" и делать "красивые" переходы, которые уже восстановлению автоматом не подлежат.
вот то что у меня получилось + пример с удалением большого знака
это?
http://jsfiddle.net/Wyjss/
совсем недавно искал ответ на этот же вопрос.
результат - низзя.
если есть возможность, сначала вставляйте заглушку, а информер грузите через JS. потом на onload вставляйте информер
не, я с этим алгоритмом завязал:) итак слишком много времени убил на это.
идея ясна, алгоритм сверху, его ограничения тоже вроде ясны.
так что энтузиасты вперёд
Что получится по вашему алгоритму в этом случае?
фигня получается. отличия до и после практически нет
как и обещал:
сейчас ухожу. через 2 часа выложу тест с тв-картинкой и сам скрипт, там всего 60 строчек
В примере с "SS" вам известна прозрачность и цвет был белый.
первая S не белая, а (50,100,150)
прикол в том, что при неизвестной прозрачности, её приходиться находить методом тупого перебора. сначала шаг в 5%, а потом по результатам шаг в 1% на заданом промежутке.
Если вы обрабатывали отдельно каждый канал R,G и B, то откуда искажение цветов взялось?
меня это тоже интересует, но уже не настолько, чтобы я начал искать причину:)
П.С. одна из возможных причин это то, что скрипт сейчас довольно топорный: ни проверки на ошибки, ни проверки на крайности(0,255)
П.П.С. так оно и есть. после проверки получается это
если вы работали с белым ватермарком, то откуда взялось такое сильное искажение цветов?
по-моему на фотке с лодкой обе S(белая и 50,100,150) убрались очень не плохо, не считая края и тени в лесу
какого же именно?
вычитать(прибавлять) надо не константу, а процент, который зависит от цвета знака и прозрачности
то есть на файлах без jpg-сжатия этот алгоритм 100% точно работает?
должОн. проверять больше желания нет:)
Вы вместо того алгоритма с вычитанием, проверку которого вам предложили сделать
это и есть результат работы модифицированного алгоритма вычитания
А причем тут края?
не уверен, но похоже фотошоп сглаживает края. что там на самом деле происходит, мне уже не интересно. не моя специализация:)
решили заливкой побаловаться?
интересно, что и куда тут можно залить, учитывая обилие красок
П.С. и да, сделайте лучше:)
ну что, подтверждается поговорка: язык мой - враг мой :)
а конкретно "водяной знак любой сложности".
большие по площади знаки удаляются без проблем, но вот на краях или на тонких линиях начинаются проблемы, потому что все библиотеки начинают "оптимизировать" и делать "красивые" переходы, которые уже восстановлению автоматом не подлежат.
вот то что у меня получилось + пример с удалением большого знака