【问题标题】:Composite multiple images together onto one image with ImageMagick使用 ImageMagick 将多张图像合成到一张图像上
【发布时间】:2015-11-04 18:49:28
【问题描述】:

我对使用 imagemagick 很陌生,所以我可能完全搞错了。

我想加载 10 张图片,并将它们合成到一个网格中,两行 5 张图片如下:

所有图像的尺寸都相同,因此没有问题,但我什至无法加载多个图像。

我尝试了以下方法:

$src1 = new \Imagick('../'.$fileSelection[0][3]);
$src1->writeImage("./output.png");
$src2 = new \Imagick('../'.$fileSelection[1][3]);
$src2->writeImage("./output2.png");

header('Content-Type: image/jpeg');
echo $src1;
echo $src2;

这似乎只输出页面上的第一张图片,没有其他内容。

我哪里错了?如何加载所有十张图像,以及如何将它们合成在一起?

我找到了以下代码:

$src1 = new \Imagick("./src1.png");
$src2 = new \Imagick("./src2.png");

$src1->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$src1->setImageArtifact('compose:args', "1,0,-0.5,0.5");
$src1->compositeImage($src2, Imagick::COMPOSITE_MATHEMATICS, 0, 0);
$src1->writeImage("./output.png");

但我在页面/空白处什么都没有。

任何建议表示赞赏。

【问题讨论】:

  • 您需要 i) 创建您想要的最终输出尺寸的“画布”图像。 ii) 加载每个图像,并合成到画布图像中 iii) 将该画布图像发送到浏览器。

标签: image imagemagick imagick


【解决方案1】:

使用Imagick::appendImages 通过遍历每一列和每一行来构建网格。

<?php
define('WIDTH',  300);
define('HEIGHT', 400);

$canvas = new Imagick();
for ($row = 0; $row < 2; $row++) {
  $stack = new Imagick();
  for ($column = 0; $column < 5; $column++) {
    // For fun, let's create some colors
    $color = sprintf('hsl(%.02f, 50, 100)', $column*99.99+$row*66.66);
    $stack->newImage(WIDTH, HEIGHT, $color);
  }
  $stack->resetIterator();
  $rowImage = $stack->appendImages(FALSE);
  $canvas->addImage($rowImage);
}
$canvas->resetIterator();
$result = $canvas->appendImages(TRUE);
$result->writeImage('/tmp/out.png');

Imagick::borderImage 可用于添加间隔,但如果我们已经在对每个图像进行迭代,那么我们还不如创建间隔以附加在它们之间。

<?php
define('WIDTH',  300);
define('HEIGHT', 400);
define('SPACE',   35);

$canvas = new Imagick();
for ($row = 0; $row < 2; $row++) {
  $stack = new Imagick();
  $stack->newImage(SPACE,1,'white');
  for ($column = 0; $column < 5; $column++) {
    $color = sprintf('hsl(%.02f, 50, 100)', $column*99.99+$row*66.66);
    $stack->newImage(WIDTH, HEIGHT, $color);
    $stack->newImage(SPACE, 1, 'white');
  }
  $stack->resetIterator();
  $rowImage = $stack->appendImages(FALSE);
  $canvas->newImage(1, SPACE, 'white');
  $canvas->addImage($rowImage);
}
$canvas->newImage(1, SPACE, 'white');
$canvas->resetIterator();
$result = $canvas->appendImages(TRUE);
$result->writeImage('/tmp/out.png');

【讨论】:

  • 这太棒了,而且非常有用。我现在正在使用此代码来尝试输出我的图像。非常感谢。
猜你喜欢
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
相关资源
最近更新 更多