Dinozavr

Рейтинг
153
Регистрация
14.01.2007

совсем недавно искал ответ на этот же вопрос.

результат - низзя.

если есть возможность, сначала вставляйте заглушку, а информер грузите через JS. потом на onload вставляйте информер

не, я с этим алгоритмом завязал:) итак слишком много времени убил на это.

идея ясна, алгоритм сверху, его ограничения тоже вроде ясны.

так что энтузиасты вперёд

netwind:
Что получится по вашему алгоритму в этом случае?

фигня получается. отличия до и после практически нет

как и обещал:


<?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);
}

jpg a.jpg
jpg 40a.jpg
jpg __1.jpg

сейчас ухожу. через 2 часа выложу тест с тв-картинкой и сам скрипт, там всего 60 строчек

netwind:
В примере с "SS" вам известна прозрачность и цвет был белый.

первая S не белая, а (50,100,150)

прикол в том, что при неизвестной прозрачности, её приходиться находить методом тупого перебора. сначала шаг в 5%, а потом по результатам шаг в 1% на заданом промежутке.

netwind:
Если вы обрабатывали отдельно каждый канал R,G и B, то откуда искажение цветов взялось?

меня это тоже интересует, но уже не настолько, чтобы я начал искать причину:)

П.С. одна из возможных причин это то, что скрипт сейчас довольно топорный: ни проверки на ошибки, ни проверки на крайности(0,255)

П.П.С. так оно и есть. после проверки получается это

jpg 40b.jpg
netwind:
если вы работали с белым ватермарком, то откуда взялось такое сильное искажение цветов?

по-моему на фотке с лодкой обе S(белая и 50,100,150) убрались очень не плохо, не считая края и тени в лесу

netwind:
какого же именно?

вычитать(прибавлять) надо не константу, а процент, который зависит от цвета знака и прозрачности

netwind:
то есть на файлах без jpg-сжатия этот алгоритм 100% точно работает?

должОн. проверять больше желания нет:)

netwind:
Вы вместо того алгоритма с вычитанием, проверку которого вам предложили сделать

это и есть результат работы модифицированного алгоритма вычитания

netwind:
А причем тут края?

не уверен, но похоже фотошоп сглаживает края. что там на самом деле происходит, мне уже не интересно. не моя специализация:)

netwind:
решили заливкой побаловаться?

интересно, что и куда тут можно залить, учитывая обилие красок

П.С. и да, сделайте лучше:)

ну что, подтверждается поговорка: язык мой - враг мой :)

а конкретно "водяной знак любой сложности".

большие по площади знаки удаляются без проблем, но вот на краях или на тонких линиях начинаются проблемы, потому что все библиотеки начинают "оптимизировать" и делать "красивые" переходы, которые уже восстановлению автоматом не подлежат.

вот то что у меня получилось + пример с удалением большого знака

jpg 42.jpg
jpg 4.jpg
jpg 40b.jpg
Всего: 1286