это?
http://jsfiddle.net/Wyjss/
совсем недавно искал ответ на этот же вопрос.
результат - низзя.
если есть возможность, сначала вставляйте заглушку, а информер грузите через JS. потом на onload вставляйте информер
не, я с этим алгоритмом завязал:) итак слишком много времени убил на это.
идея ясна, алгоритм сверху, его ограничения тоже вроде ясны.
так что энтузиасты вперёд
фигня получается. отличия до и после практически нет
как и обещал:
<?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); }
сейчас ухожу. через 2 часа выложу тест с тв-картинкой и сам скрипт, там всего 60 строчек
первая S не белая, а (50,100,150)
прикол в том, что при неизвестной прозрачности, её приходиться находить методом тупого перебора. сначала шаг в 5%, а потом по результатам шаг в 1% на заданом промежутке.
меня это тоже интересует, но уже не настолько, чтобы я начал искать причину:)
П.С. одна из возможных причин это то, что скрипт сейчас довольно топорный: ни проверки на ошибки, ни проверки на крайности(0,255)
П.П.С. так оно и есть. после проверки получается это
по-моему на фотке с лодкой обе S(белая и 50,100,150) убрались очень не плохо, не считая края и тени в лесу
вычитать(прибавлять) надо не константу, а процент, который зависит от цвета знака и прозрачности
должОн. проверять больше желания нет:)
это и есть результат работы модифицированного алгоритма вычитания
не уверен, но похоже фотошоп сглаживает края. что там на самом деле происходит, мне уже не интересно. не моя специализация:)
интересно, что и куда тут можно залить, учитывая обилие красок
П.С. и да, сделайте лучше:)
ну что, подтверждается поговорка: язык мой - враг мой :)
а конкретно "водяной знак любой сложности".
большие по площади знаки удаляются без проблем, но вот на краях или на тонких линиях начинаются проблемы, потому что все библиотеки начинают "оптимизировать" и делать "красивые" переходы, которые уже восстановлению автоматом не подлежат.
вот то что у меня получилось + пример с удалением большого знака