2015-01-09 32 views
0

在這裏是否有任何ERODE(來自Paint Shop Pro的名稱)過濾器在PHP/GDLIB中的實現?我試圖找到一個,但沒有運氣......其實連ImageMagick的不具有過濾器...PHP腐蝕圖像 - NOT IMAGEMAGICK

我的意思是過濾器,該轉換:

enter image description here

要這樣:

enter image description here

其他例子表明,blur是不一樣的

enter image description here

請注意,這些都不是人工生成的圖像 - 他們是ERODE過濾器的活生生的實例在Paint Shop Pro 9

+0

這只是模糊了圖像。 Imagik確實有:http://php.net/manual/en/imagick.blurimage.php – kainaw

+0

它不是。檢查問題編輯。 –

+0

根據過濾器描述,侵蝕每個像素工作。像素的亮度增加到每個相鄰像素的最大亮度。但是,您的示例似乎做了相反的事情。每個像素的亮度降低到每個相鄰像素的最小亮度。如果你想這樣做,在PHP中編寫它並不是一個非常複雜的函數。 – kainaw

回答

0

我還沒有看到這個功能直到這個問題。我在ImageMagick中看不到它(它當然不是內置的PHP函數)。我喜歡它做了什麼,所以我寫了一些功能相同的功能。這隻適用於一個像素半徑。我試圖儘可能詳細地寫出它,以便其他人可以根據自己的需要定製代碼。

// Takes an image, (x,y) coordinate, and returns the luminosity 
function imageluminosity(&$img, $x, $y) 
{ 
    $rgb = imagecolorat($img, $x, $y); 
    $r = ($rgb >> 16) & 0xFF; 
    $g = ($rgb >> 8) 0xFF; 
    $b = $rgb & 0xFF; 
    // These values are based on standard pixel brightness per color. 
    // 0.299+0.587+0.114 = 1 
    return 0.299*$r + 0.587*$g + 0.114*$b; 
} 

// Degrades an image by enhancing the darker areas of the image. 
// Does not alter the original image. 
// Returns an eroded image. 
// This works on EVERY pixel, so it takes a looooong time. 
function imagedegrade(&$oimg) 
{ 
    $img = imagecreatetruecolor(imagesx($oimg), imagesy($oimg)); 
    for($x=0; $x<imagesx($oimg); $x++) 
    { 
     for($y=0; $y<imagesy($oimg); $y++) 
     { 
      //Find the most luminosity in any neighboring pixel 
      $olum = $blum = imageluminosity($oimg, $x, $y); 
      if($x>0) 
      { 
       if($y>0) 
       { 
        $tlum = imageluminosity($oimg, $x-1, $y-1); 
        if($tlum > $lum) $blum = $tlum; 
       } 
       $tlum = imageluminosity($oimg, $x-1, $y); 
       if($tlum > $lum) $blum = $tlum; 
       if($y<imagesy($oimg)-1) 
       { 
        $tlum = imageluminosity($oimg, $x-1, $y+1); 
        if($tlum > $lum) $blum = $tlum; 
       } 
      } 
      if($y>0) 
      { 
       $tlum = imageluminosity($oimg, $x1, $y-1); 
       if($tlum > $lum) $blum = $tlum; 
      } 
      if($y<imagesy($oimg)-1) 
      { 
       $tlum = imageluminosity($oimg, $x1, $y+1); 
       if($tlum > $lum) $blum = $tlum; 
      } 
      if($x<imagesx($oimg)-1) 
      { 
       if($y>0) 
       { 
        $tlum = imageluminosity($oimg, $x+1, $y-1); 
        if($tlum > $lum) $blum = $tlum; 
       } 
       $tlum = imageluminosity($oimg, $x+1, $y); 
       if($tlum > $lum) $blum = $tlum; 
       if($y<imagesy($oimg)-1) 
       { 
        $tlum = imageluminosity($oimg, $x+1, $y+1); 
        if($tlum > $lum) $blum = $tlum; 
       } 
      } 
      // Get RGB from original image 
      $color = imagecolorat($oimg, $x, $y); 
      $r = ($rgb >> 16) & 0xFF; 
      $g = ($rgb >> 8) & 0xFF; 
      $b = $rgb & 0xFF; 
      // Adjust luminosity to best luminosity of any neighboring pixel. 
      if($olum != $blum) 
      { 
       $diff = $olum - $blum; 
       $r = min(255, max(0, round($r + $diff * 0.299))); 
       $g = min(255, max(0, round($g + $diff * 0.587))); 
       $b = min(255, max(0, round($b + $diff * 0.114))); 
      } 
      // Get or allocate new color. 
      $color = imagecolorexact($img, $r, $g, $b); 
      if($color == -1) 
       $color = imagecolorallocate($img, $r, $g, $b); 
      imagesetpixel($img, $x, $y, $color); 
     } 
    } 
    return $img; 
} 

我希望我沒有任何錯別字。我使用的功能不那麼冗長,但非常神祕。

+0

謝謝,我會盡快檢查。 –