Imagick PHP扩展--Montage帮助?

5

我一直在使用Imagick PHP扩展生成图片时遇到了一些问题。除了我的“montage”有一个白色背景,因此我无法将其覆盖在其他东西上以外,一切都正常。我该如何生成具有透明背景的拼贴图?

       $Montage = $Icons->montageImage(new imagickdraw(), "3x2+0+0", "34x34+3+3", imagick::MONTAGEMODE_UNFRAME, "0x0+0+0");
      $Canvas->compositeImage($Montage, $Montage->getImageCompose(), 5, 5);

谢谢!!

2个回答

4

我知道这是一个老问题,但我发现使用Imagick的montageImage函数可以另一种方式来解决它。在你创建你的Imagick对象之后,你必须将背景声明为透明的,像这样:

$Icons->setBackgroundColor(new ImagickPixel('transparent'));

一旦设置了这个,你就可以将对象通过montageImage函数运行,这将创建一个带有透明背景的montageImage:

$Montage = $Icons->montageImage(new imagickdraw(), "3x2+0+0", "34x34+3+3", imagick::MONTAGEMODE_UNFRAME, "0x0+0+0");

然后,您可以将新的拼贴图像添加到复合图像中,确保使用预定义的Imagick复合常量COMPOSITE_ATOP或您想要的常量,如下所示:

$Canvas->compositeImage($Montage, imagick::COMPOSITE_ATOP, 5, 5);

我刚看到这个问题,决定提供另一种解决方案,以防有人想要不使用手动循环的方式进行操作。


3

我曾经遇到过同样的问题,并发现MagickWand C API(支持imagick)不支持montage选项。

最终我手动进行了拼接,方法如下:

// Add them to an array of Imagick objects, instead of using addImage().
$images = new Array();

// Make a transparent canvas.
$target = new Imagick();
$target->newImage($width, $height * count(images), 'none');

$i = 0;
foreach ($images as $image) {
    $target->compositeImage($image, imagick::COMPOSITE_COPY, 0, $height * $i++);
}

很遗憾你必须手动完成这个任务,但至少你的建议让我免去了一个严重的头疼。我需要将图像以2x2的布局拼接在一起,但是通过微调你的代码片段,现在完美地适配了。 - Patonza
请查看下面的答案。它使用montageImage,可以正常工作。 - javsmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接