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

时间:2016-12-11 17:49:59

标签: php graphics imagemagick imagick

我试图删除PNG文件的Alpha通道(透明度),并用PHP中的白色背景替换它。

使用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 个答案:

答案 0 :(得分:2)

只需省略停用透明度的第一行代码,然后运行:

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

答案 1 :(得分: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);
    }

以这种方式调用函数:

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

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

让我知道这对您有何影响。