在 ImageMagick v7 上使用 clipPath 后创建透明图像

Create transparent image after using clipPath on ImageMagick v7

在 ImageMagick v6 上,我使用以下代码创建了一个带有剪辑路径的透明图像:

try {
    $im = new Imagick($image);
    $tmpOut = $im->identifyImage(TRUE);
    
    if(isset($tmpOut["rawOutput"]) AND strpos($tmpOut["rawOutput"], "Clipping path:") !== FALSE) {
        $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_TRANSPARENT);
        $im->clipImage();
        $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);
    }
    $im->writeImage($pathSave . $filename);
    $im->destroy();
} catch (ImagickException $e) {
    var_dump($e);
}

从版本 7 开始出现以下错误:

Undefined class constant 'ALPHACHANNEL_OPAQUE'

我已经搜索过了,对应的应该是:

Imagick::ALPHACHANNEL_OFF

但是当我使用它时,背景是白色的,不像以前使用 ImageMagick 版本 6 时那样透明。

也许你们中的一些人 运行 遇到过这种情况并且知道解决这个问题的方法。

我用 shell_exec 修复了它,并添加了一个检查变量是否存在于我的 linux 系统中,其中 imagemagick 版本 6 处于活动状态。并将 $im->destroy() 更改为 $im->clear() 因为 destroy 已被弃用

我的新代码如下:

try {
    $im = new Imagick($image);
    $tmpOut = $im->identifyImage(TRUE);

    if(isset($tmpOut["rawOutput"]) AND strpos($tmpOut["rawOutput"], "Clipping path:") !== FALSE) {
        if(defined('Imagick::ALPHACHANNEL_OPAQUE')) {
            $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_TRANSPARENT);
            $im->clipImage();
            $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);
        } else {
            $im->clear();
            $im = null;
            shell_exec("magick {$image} -alpha opaque -clip -alpha transparent +clip {$pathSave}{$filename}");
        }
    }
    
    if($im !== null) {
        $im->writeImage($pathSave . $filename);
        $im->clear();
        $im = null;
    }
} catch (ImagickException $e) {
    var_dump($e);
}