Imagick:如何使用appendImages拼接图像网格

3

我在php中没有使用exec命令,因此无法像手册中所述那样运行以下内容:http://www.imagemagick.org/Usage/layers/。手册中指出:“您可以进一步制作整个图像数组,并通过行或列构建它们。”

convert \( font_1.gif font_2.gif font_3.gif +append \) \
          \( font_4.gif font_5.gif font_6.gif +append \) \
          \( font_7.gif font_8.gif font_9.gif +append \) \
          \( -size 32x32 xc:none  font_0.gif +append \) \
          -background none -append   append_array.gif

使用imagick中的http://php.net/manual/en/imagick.appendimages.php appendImages函数,如何模拟看似更强大的append CLI命令通过行和列连接图像?或者仅使用imagick中的appendImages函数无法实现?

我希望能够在php中创建以下数组,循环遍历它,并在每个新行上告诉imagick何时在合并图像之前开始新行。

$rack = [
            'row1' => [
                'image1.jpg',
                'image2.jpg'
            ],
            'row2' => [
                'image3.jpg',
                'image4.jpg'
            ]
        ];

我的问题是,如何在imagick或其他imagick函数中使用appendImages来实现与CLI convert -append命令类似的结果?
我知道我可以使用其他函数,比如compositeImage,并使用x、y来控制定位,但对于我的用例来说,简单地按行附加会更简单得多。
1个回答

4
您可以使用appendImages()来执行两个阶段的过程(类似于该命令似乎要做的事情):
  1. 迭代各行,使用appendImages()从左到右水平地附加每一行的内容,并指定stack=false
  2. 使用appendImages()从上到下垂直地附加所有生成的Imagick行对象,并指定stack=true
像这样:
$rack = [
        'row1' => [
            'image1.jpg',
            'image2.jpg'
        ],
        'row2' => [
            'image3.jpg',
            'image4.jpg'
        ]
    ];

$fullimage = new Imagick();

foreach ($rack as $k => $v) {
    $rowimg = new Imagick();
    foreach ($v as $imagelocation) {
       $rowimg->readImage($imagelocation);
    }
    $rowimg->resetIterator();
    $combinedrow = $rowimg->appendImages(false);
    $fullimage->addImage($combinedrow);
}

$fullimage->resetIterator();
$finalimage = $fullimage->appendImages(true); // <-- Done.

太棒了!我从来没有想过需要resetIterator才能让它工作。你知道是否有其他函数需要在调用函数之前调用resetIterator,以使函数正常工作吗? - Danack
遗憾的是,该函数甚至没有得到适当的文档支持,它只有在使用PixelIterators时才需要,但我猜appendImages可能是其中一个内部使用它们的函数(那为什么不在内部也调用reset呢?)。我不记得其他函数需要类似的东西,但我非常怀疑appendImages是唯一需要的函数... - uraimo
1
如果你发现其他问题,请在 https://github.com/mkoppanen/imagick/ 上报告,它们可能会有一天被修复。 - Danack
1
还有一件需要注意的事情,如果在不使用堆栈布尔值(false/true)调用appendImages时返回null,则需要添加它(这是我遇到的修复null问题的情况,即从本地机器加载真实图像)。 - Cu7l4ss
1
@Cu7l4ss 你刚刚救了我的夜晚!我找不到任何文档来解决这个问题。这个库真是荒谬。 - ndm13

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