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)
当我评论那条线路时,一切似乎都工作正常.我该如何防止此错误?
我在删除 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 对象都得到适当处理。