ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 18.05.2010, 16:40
Аватар для roxblnfk
roxblnfk
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме:
217996

Репутация: 56
Отправить сообщение для roxblnfk с помощью ICQ
По умолчанию

недавно как раз писал функцию для очистки изображения от малых площадей.

щас подстёр лишнее, должно работать (не тестил)

PHP код:
$ImgName='...';

$im ImageCreateFromJpeg($ImgName);
$W=imagesx($im);
$H=imagesy($im);
$IMAGE=array();
$WHITE=array();
for(
$x=0;$x<$W;$x++){
    for(
$y=0;$y<$H;$y++){
        
$rgb ImageColorAt($im$x$y);
        
$r = ($rgb >> 16) & 0xFF;
        
$g = ($rgb >> 8) & 0xFF;
        
$b $rgb 0xFF;
        
$int1=63;
        
$int2=195;
        if(
$r<$int1 && $g<$int1 && $b<$int1$IMAGE[$x][$y]=2;
        if(
$r<$int2 && $g<$int2 && $b<$int2$IMAGE[$x][$y]=1;
        else 
$IMAGE[$x][$y]=0;
        
$WHITE[$x][$y]=false;
    }
}
function 
get_volume_pedratXD(&$IMAGE, &$WHITE$x$y$arrOk=array(1,2), $lim=200$towhite=true){
    
$MA=array($x=>array($y=>true));//micro array
    
$S=1;
    
$arrow=array(array(0=>1,1=>0),array(0=>-1,1=>0),array(0=>0,1=>1),array(0=>0,1=>-1));
    do{
        
$add=0;
        foreach(
$MA as $X=>$z){
            foreach(
$z as $Y=>$V){
                if(
$lim<$S) return array($S,$MA);
                if(
$V!==false){
                    foreach(
$arrow as $arrrr){
                        
$ax=$X+$arrrr[0];
                        
$ay=$Y+$arrrr[1];
                        if(!isset(
$MA[$ax][$ay]) && isset($IMAGE[$ax][$ay]))if($WHITE[$ax][$ay]!==true){
                            if(
$towhite)$WHITE[$ax][$ay]=true;
                            if(
in_array($IMAGE[$ax][$ay],$arrOk,true)){
                                
$MA[$ax][$ay]=true;
                                
$add++;
                                
$S++;
                            }else 
$MA[$ax][$ay]=false;
                        }
                    }
                }
            }
        }
    }while(
$add>0);
    return array(
$S,$MA);
}
function 
kill_perperellipepidi(&$IMAGE$WHITE$arrOk=array(1,2), $lim=200$Min=1$Max=15$Salit=0){
    
$arrow=array(array(1,0),array(-1,0),array(0,1),array(0,-1));
    foreach(
$IMAGE as $x=>$z){
        foreach(
$z as $y=>$Z){
            if(
$WHITE[$x][$y]!==true && in_array($Z,$arrOk,true)){
                
$SS=get_volume_pedratXD($IMAGE,$WHITE,$x,$y,$arrOk,$lim);
                
$S=$SS[0];
                
$Arr=$SS[1];
                
//echo '<br>Scan SSS: ['.$x.','.$y.'] = '.$S;
                
if($S<=$Max && $S>=$Min){
                    foreach(
$Arr as $X=>$v){
                        foreach(
$v as $Y=>$V){
                            if(
$V==true$IMAGE[$X][$Y]=$Salit;
                        }
                    }
                }
                
//вот тут пиши функцию для преобразования массива 
                //в строку, какую тебе угодно... например $RETURN[]=$Arr; return $RETURN; (и функция вернёт массивы $Arr на все пятна в отдельном массиве)
                
                //$S передаёт площадь пятен
                //$Arr ===== $Arr[$x][$y]=$Value ($Value должно быть true, если он false, то пиксель был просканен, но он не относится к пятну)
                // параметр этой функции $Salit - каким index'ом залить пятно, если его площадь от $Min до $Max включительно (если не надо, то назнач $Max=-1)
                // $Lim для тех кто шарит, сам же ставь равным площади всей картинки
                // $WHITE - массив предела сканирования, не парься, если задача простая
            
}
        }
    }
}
//просчитываем массив картинки $IMAGE:
kill_perperellipepidi($IMAGE,$WHITE,array(1,2),$W+$H,1,-1,0); 
раскуривай коменты
 
Ответить с цитированием

  #12  
Старый 18.05.2010, 17:20
Аватар для roxblnfk
roxblnfk
Познающий
Регистрация: 07.02.2010
Сообщений: 70
Провел на форуме:
217996

Репутация: 56
Отправить сообщение для roxblnfk с помощью ICQ
Angry

кстати, чтобы понять, что функция нашла нужные пиксели, то можно перекрасить их на картинке и посмотреть картинку
(добавить)
PHP код:
kill_perperellipepidi($IMAGE,$WHITE,array(1,2),$W+$H,1,$W+$H,1);
$black=imagecolorallocate($im,0,0,0);
$red=imagecolorallocate($im,255,0,0);
$green=imagecolorallocate($im,0,255,0);
$white=imagecolorallocate($im,255,255,255);
for(
$x=0;$x<$W;$x++){
    for(
$y=0;$y<$H;$y++){
        if(
$IMAGE[$x][$y]===0)imagesetpixel($im,$x,$y,$white);
        if(
$IMAGE[$x][$y]===1)imagesetpixel($im,$x,$y,$red);
    }
}
imagegif($im,'result.gif'); 
должно работать, с виду в коде багов нет

===============

Ну что, автор, помог или нет?

Последний раз редактировалось roxblnfk; 18.05.2010 в 20:20..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ