直到这个问题我才看到这个功能。我在 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;
}
我希望我没有打错字。我使用的函数不那么冗长,但非常神秘。