代码之家  ›  专栏  ›  技术社区  ›  ninsky

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

  •  3
  • ninsky  · 技术社区  · 8 年前

    我试图删除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)与ImageMagic 6.8.9-9 Q16 x86_64 2016-03-14编译。当前版本(Ubuntu 16.04)。


    宁斯基

    2 回复  |  直到 8 年前
        1
  •  6
  •   Mark Setchell    8 年前

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

    $iMagick->setImageBackgroundColor('#FFFFFF');
    $iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
    
        2
  •  1
  •   Idan    8 年前

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

    让我知道你是怎么做到的。