PHP:使用ImageMagick将Alpha通道转换为白色背景

3
我正在尝试在PHP中去除PNG文件的Alpha通道(透明度)并替换为白色背景。使用ImageMagick,我已经尝试了几个函数,但到目前为止都没有成功。以下是未能工作的函数:
    $iMagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
    $iMagick->setImageBackgroundColor('#FFFFFF');
    $iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

同时,使用 setBackgroundColor('#FFFFFF') 替代 setImageBackgroundColor('#FFFFFF') 也没有帮助。同样,在这两个函数中将 '#FFFFFF' 替换为 'white' 也没有用。

使用 ImageMagick 3.4.0RC6(发布日期:2016-11-29),编译于 ImageMagick 6.8.9-9 Q16 x86_64 2016-03-14。当前版本(Ubuntu 16.04)。

有什么想法吗?提前感谢
ninsky

2个回答

6

只需省略掉取消透明度的第一行代码,然后运行:

$iMagick->setImageBackgroundColor('#FFFFFF');
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

我已经尝试过并使用Imagick的identify -verbose进行了测试。得到的结果是:“通道深度:红色:8位,绿色:8位,蓝色:8位,alpha:1位。透明颜色:无”。所以我认为这个方法很有效。谢谢! - ninsky
1
@peter 想象一叠图像,每个图像中都有一些透明区域。首先,在桌子上放一张白纸,即 BackgroundColor(white),然后将所有其他带有透明区域的图像放在上面。最终效果是当它们全部透明时,你会看到白色。 - Mark Setchell

1

这是我正在使用的一个函数。它不基于ImageMagick,而是从另一个stackoverflow答案中获取并定制为仅着色透明像素。

function colorizeTransparent( $file, $targetR, $targetG, $targetB, $targetName ) {

        $im_src = imagecreatefrompng( $file );
        $width = imagesx($im_src);
        $height = imagesy($im_src);
        $im_dst = imagecreatefrompng( $file );

        for( $x=0; $x<$width; $x++ ) {
            for( $y=0; $y<$height; $y++ ) {
                $rgba = imagecolorat( $im_src, $x, $y );
                $alpha = ($rgba & 0x7F000000) >> 24;
                if ($rgba == 0) {
                    $col = imagecolorallocatealpha( $im_dst,
                        $targetR - (int) ( 1.0 / 255.0  * $alpha * (double) $targetR ),
                        $targetG - (int) ( 1.0 / 255.0  * $alpha * (double) $targetG ),
                        $targetB - (int) ( 1.0 / 255.0  * $alpha * (double) $targetB ),
                        $alpha
                    );
                } else $col = $rgba;
                imagesetpixel( $im_dst, $x, $y, $col );
            }
        }
        imagepng( $im_dst, $targetName);
    }

Call the function this way:

colorizeTransparent($sourceImage, 0xFF, 0xFF, 0xFF, $colorizedImage);

如果$sourceImage是源文件名,$colorizedImage是目标文件名。

请告诉我它对你有什么效果。


谢谢。我没有测试它,因为我想坚持使用Imagick函数。还是谢谢。 - ninsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接