0

我试图通过使用转换为 alpha 过滤器来实现接近 Fireworks 所做的事情(请参阅http://erskinedesign.com/blog/fireworks-tips-convert-alpha/)。这可能只使用 php gd 函数吗?

我的代码如下所示:

$img = imagecreatefromstring(file_get_contents('...'));

imagealphablending($img, true);
$transparentcolour = imagecolorallocate($img, 255,255,255);
imagecolortransparent($img, $transparentcolour);
imagefilter($img, IMG_FILTER_GRAYSCALE);

$w = imagesx($img);
$h = imagesy($img);

for ($x=0; $x<$w; $x++)
{
    for ($y=0; $y<$h; $y++)
    {
        $color = imagecolorsforindex($img, imagecolorat($img, $x, $y));

        if ($color['alpha'] == 0)
            continue;
    }
}
imagepng($img);
exit;

我的想法是转换为灰度,测量一个像素的“暗”程度,然后将其转换为黑色 alpha,但我自己似乎很困惑。

4

1 回答 1

2

奇怪的是,当我发现你的问题时,我正在寻找同样的东西。最终构建了这个功能,我认为它的工作方式不如你想要的那样。

function n2_image_make_alpha( $im , $percentage )
{
    imagefilter( $im , IMG_FILTER_GRAYSCALE );

    $width = imagesx( $im );
    $height = imagesy( $im );

    imagealphablending( $im , false );
    imagesavealpha( $im , true );

    $newim = imagecreatetruecolor( $width , $height );
    imagealphablending( $newim , false );
    imagesavealpha( $newim , true );


    //Loop through pixels
    for ( $x = 0 ; $x < $width ; $x++ )
    {
        for ( $y = 0 ; $y < $height ; $y++ )
        {
            //Get the color of the pixel
            $color = imagecolorat( $im , $x , $y );
            //Get the rgba of the color
            $rgba = imagecolorsforindex( $im , $color );
            $alpha = $rgba['alpha'];
            if ( $alpha < 127 )
            {
                $base_alpha = 127 - $alpha; //100% of the difference between completely transparent and the current alpha
                $percentage_to_increase_alpha = intVal( $percentage * $base_alpha / 100 );
                $alpha = $alpha + $percentage_to_increase_alpha;
            }
            $new_color = imagecolorallocatealpha ( $newim , $rgba['red'] , $rgba['green'] , $rgba['blue'] , $alpha );
            imagesetpixel ( $newim , $x , $y , $new_color );
        }
    }
    return $newim;
}
于 2013-09-26T00:07:21.260 回答