使用 ImageMagick 将多张图片合成一张图片
Composite multiple images together onto one image with ImageMagick
我刚开始使用 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");
但我在 page/blank 上一无所获。
感谢任何建议。
使用 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');
我刚开始使用 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");
但我在 page/blank 上一无所获。
感谢任何建议。
使用 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');