【问题标题】:PHP (ImageMagick) - Merge images from source dataPHP (ImageMagick) - 从源数据合并图像
【发布时间】:2021-04-09 21:27:55
【问题描述】:

我有一组有效的图像源,我想在 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 个演示者。

【问题讨论】:

  • 对于 ,它是一个文件名吗?
  • 只是为了确认。

标签: php imagemagick


【解决方案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);

结果在意料之中! 由 4 个相等大小的图片合并而成的人物图片 (result.png)。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2019-03-14
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多