PHP (ImageMagick) - 从源数据合并图像

PHP (ImageMagick) - Merge images from source data

我有一组有效的图像源,我想在 PHP.

中使用 ImageMagick 水平合并它们

代码:

$imagePartsData = ["<VALID JPG DATA 1>", "<VALID JPG DATA 2>", ...];

$initImage = function($source): Imagick
{
    $im = new Imagick();
    $im->setFormat('png');
    $im->readImageBlob($source);

    return $im;
};

$firstPart = $initImage($imagePartsData[0]);

// foreach other parts
for($i = 1, $c = count($imagePartsData); $i < $c; $i++)
{
    $part = $initImage($imagePartsData[$i]);
    $firstPart->addImage($part);
}

$firstPart->resetIterator();
$combined = $firstPart->appendImages(false);
$combined->setImageFormat("png");

header('Content-Type: image/png');
echo $combined;

结果是black background with white square

预期结果:4 张 .png 图片合并为 1 个演示人。

我的解决方案:

$imagePartsData 是一个从左到右排序的图像源数组,因此在 for 循环中它会正确添加图像。

function saveImage(Imagick $imagick)
{
    $imagick->setImageFormat("png");
    $imagick->writeImageFile(fopen('result.png', 'wb'));
    die('saved');
}

function initImage(string $source): Imagick
{
    $im = new Imagick();
    $im->setFormat('png');
    $im->readImageBlob($source);

    return $im;
}

$firstPart = initImage($imagePartsData[0]);

$partWidth = $firstPart->getImageWidth();
$partHeight = $firstPart->getImageHeight();

// foreach other parts
for($i = 1, $c = count($imagePartsData); $i < $c; $i++)
{
    $part = initImage($imagePartsData[$i]);
    $firstPart->addImage($part);
}

$montage = $firstPart->montageImage(new ImagickDraw(), $c.'x1', $partWidth.'x'.$partHeight, 0, '0');

saveImage($montage);

结果如期而至! 人物图片 (result.png) 从 4 张 大小的图像合并而来。