ImageMagick - setImageAlphaChannel不工作(php)

gre*_*ghz 12 php imagemagick image-processing imagick

所以我有这个IM命令($ plistnew是你想要多边形的坐标列表):

convert in.png ( -size 101x101 xc:black -fill white \
    -draw "polygon $plistnew" -alpha off \
    -crop 101x100+0+1 +repage \
    -scale 101x1! ) \
    -clut out.png
Run Code Online (Sandbox Code Playgroud)

所以我需要将其转换为纯PHP.除了setImageAlphaChannel()的一个剩余问题之外,我已经非常成功.

无论如何,这是我的PHP:

$tmpa = new Imagick(); // for the image I'm assuming is generated inside the parens
$tmpa->newPseudoImage(101, 101, 'canvas:black'); // xc:black

$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white')); // -fill white
$draw->polygon($points); // -draw "polygon $plistnew"

$tmpa->drawImage($draw);
$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE); // -alpha off
$tmpa->cropImage(101, 100, 0, 1); // -crop 101x100+0+1

// +repage
$tmpa->resetImagePage('');

$tmpa->scaleImage(101, 1); // -scale 101x1! -- I think scaleImage() ignores ratio per the ! by default ... I'm not positive though.

$im = new Imagick('in.png');
$im->clutImage($tmpa); // -clut
$im->writeImage('out.png');
$tmpa->destroy();
Run Code Online (Sandbox Code Playgroud)

$ points变量是一个适合与ImagickDraw :: polygon()一起使用的数组.

这一行:

$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE);
Run Code Online (Sandbox Code Playgroud)

扁平不起作用.它会产生以下错误:

PHP Fatal error:  Uncaught exception 'ImagickException' with message 'Unable to set image alpha channel'
Run Code Online (Sandbox Code Playgroud)

当我评论那条线路时,一切似乎都工作正常.我该如何防止此错误?

stw*_*ite 6

我在删除 PNG 和 GIF 的 alpha 通道时也遇到了问题,所以我尝试了几件事,但最终使用了这个:

// Image has transparency
if ($image->getImageAlphaChannel()) {

    // Remove alpha channel
    $image->setImageAlphaChannel(11);

    // Set image background color
    $image->setImageBackgroundColor('white');

    // Merge layers
    $image->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);
}
Run Code Online (Sandbox Code Playgroud)

我使用“11”是因为 imagick::ALPHACHANNEL_REMOVE 不适用于我的版本。有关 imagick::ALPHACHANNEL_REMOVE 的参考,请参阅此评论:http ://php.net/manual/en/imagick.flattenimages.php#116665


And*_*dri -1

我还没有对此进行测试,但如果您的最终目标是生成不带 Alpha 通道支持的不透明图像,也许可以尝试将Imagick::setFormat函数设置为png24

$tmpa->setFormat('png24');
Run Code Online (Sandbox Code Playgroud)

这将强制 Imagick 对象使用不透明的 24 位 PNG 格式,而不是不透明或透明的 32 位 PNG 格式。您可能必须设置背景颜色或某种效果,以确保添加到图像中的任何 alpha 对象都得到适当处理。