【问题标题】:PHP: Convert alpha channel to white background with ImageMagickPHP:使用 ImageMagick 将 Alpha 通道转换为白色背景
【发布时间】:2016-12-11 17:49:58
【问题描述】:

我正在尝试删除 PNG 文件的 alpha 通道(透明度)并将其替换为 PHP 中的白色背景。

使用 ImageMagick,到目前为止,我已经尝试了几个功能,但都没有成功。这些是不起作用的功能:

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

另外setBackgroundColor('#FFFFFF') 而不是setImageBackgroundColor('#FFFFFF') 也没有帮助。与在这 2 个函数中将 '#FFFFFF' 替换为 'white' 相同。

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

有什么想法吗?提前感谢
宁斯基

【问题讨论】:

    标签: php graphics imagemagick imagick


    【解决方案1】:

    只需省略禁用透明度的第一行代码并运行:

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

    【讨论】:

    • 我已经用 Imagick 的 identify -verbose 试过了。得到:“通道深度:红色:8 位,绿色:8 位,蓝色:8 位,alpha:1 位。透明色:无”。所以我认为这成功了。谢谢!
    • @peter 想象一堆图像,每个图像中都有一些透视位(透明区域)。首先,在你的桌子上放一张白纸,即BackgroundColor(white),现在将所有其他透明区域的图像放在上面。净效果是你会看到白色,它们都是透明的。
    【解决方案2】:

    这是我正在使用的一个函数。不过,它不是基于 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 是目标文件名。

    让我知道你的效果如何。

    【讨论】:

    • 谢谢。没有测试它,因为我想坚持使用 Imagick 功能。还是谢谢。
    猜你喜欢
    • 2019-12-17
    • 2022-12-05
    • 2011-07-13
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2016-05-09
    • 2014-10-26
    • 2018-03-25
    相关资源
    最近更新 更多