【问题标题】:PHP Erode Image - NOT IMAGEMAGICKPHP 侵蚀图像 - 不是 IMAGEMAGICK
【发布时间】:2015-01-09 15:20:43
【问题描述】:

这里是否有任何ERODE(来自 Paint Shop Pro 的名称)过滤器在 PHP/GDLIB 中的实现?我试图找到一个,但没有运气......事实上,即使 ImageMagick 也没有那个过滤器......

我的意思是转换这个的过滤器:

到这里:

其他说明blur不一样的例子

请注意,这些不是手动生成的图像 - 它们是ERODE 过滤器在Paint Shop Pro 9 中的实时示例

【问题讨论】:

  • 只是模糊了图像。 Imagik 确实有:php.net/manual/en/imagick.blurimage.php
  • 不是。检查问题编辑。
  • 根据过滤器的描述,腐蚀是按像素工作的。像素的亮度增加到每个相邻像素的最大亮度。但是,您的示例似乎相反。每个像素的亮度降低到每个相邻像素的最小亮度。如果你想这样做,用 PHP 编写它并不是一个非常复杂的函数。
  • 什么?我不会说它会降低一些亮度......侵蚀的P似乎更暗...... PS。正如我所说,我使用 Paint Shop Pro 来生成这些示例。

标签: php image filter


【解决方案1】:

直到这个问题我才看到这个功能。我在 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;
}

我希望我没有打错字。我使用的函数不那么冗长,但非常神秘。

【讨论】:

  • 谢谢,我会尽快检查。
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
相关资源
最近更新 更多