我发现 Imagick::clipPathImage 和 Imagic::clipImage 的工作方式与我预期不符。我以为它们只会裁剪路径并丢弃多余的数据,然后就完成了。事实并非如此。
以下是我使用裁剪路径的方法
<?php
$img = new Imagick("/Path/To/Test/Image.psd");
$geometry = $img->getImageGeometry();
$img->clipPathImage("#1", false);
$draw = new ImagickDraw();
$draw->setFillColor("#000000");
$draw->color(0,0, imagick::PAINT_RESET);
$img->drawImage($draw);
$composite = new Imagick($path);
$composite->newImage( $geometry['width'], $geometry['height'], new ImagickPixel("white"), 'png');
$composite->compositeImage($img, imagick::COMPOSITE_COPY, 0, 0);
?>
然后,对生成的图像进行任何调整大小或创建缩略图的操作都会忽略所有先前的命令,因此我“保存”了它并从一个新的 Imagick 对象开始
<?php
$clipped = new Imagick();
$clipped->readImageBlob($composite->getImageBlob());
?>
我相信有更简单的方法,但这花了我一段时间才弄清楚,并且遇到了一些障碍,所以我希望它能够帮助正在路上的人。
这与 convert 的等效命令如下
$ convert Test.psd -fill white -colorspace rgb -draw "color 0 0 reset" -clip -colorspace rgb -draw "Image Copy 0,0 0,0 'Test.psd'" OutputFile.png