我发现 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