在這裏是否有任何ERODE
(來自Paint Shop Pro的名稱)過濾器在PHP/GDLIB中的實現?我試圖找到一個,但沒有運氣......其實連ImageMagick的不具有過濾器...PHP腐蝕圖像 - NOT IMAGEMAGICK
我的意思是過濾器,該轉換:
要這樣:
其他例子表明,blur
是不一樣的
請注意,這些都不是人工生成的圖像 - 他們是ERODE
過濾器的活生生的實例在Paint Shop Pro 9
在這裏是否有任何ERODE
(來自Paint Shop Pro的名稱)過濾器在PHP/GDLIB中的實現?我試圖找到一個,但沒有運氣......其實連ImageMagick的不具有過濾器...PHP腐蝕圖像 - NOT IMAGEMAGICK
我的意思是過濾器,該轉換:
要這樣:
其他例子表明,blur
是不一樣的
請注意,這些都不是人工生成的圖像 - 他們是ERODE
過濾器的活生生的實例在Paint Shop Pro 9
我還沒有看到這個功能直到這個問題。我在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;
}
我希望我沒有任何錯別字。我使用的功能不那麼冗長,但非常神祕。
謝謝,我會盡快檢查。 –
這只是模糊了圖像。 Imagik確實有:http://php.net/manual/en/imagick.blurimage.php – kainaw
它不是。檢查問題編輯。 –
根據過濾器描述,侵蝕每個像素工作。像素的亮度增加到每個相鄰像素的最大亮度。但是,您的示例似乎做了相反的事情。每個像素的亮度降低到每個相鄰像素的最小亮度。如果你想這樣做,在PHP中編寫它並不是一個非常複雜的函數。 – kainaw