使用 imagick php 合并多个图像(复合),第一个图像的一部分被删除

问题描述 投票:0回答:1

我正在处理 PDF 图像。 我有一张空白的“夹具”图像,我会将其放入打印机中,并尝试一次将作业图像添加到其中。每个图像位于不同的位置,以免重叠。 我遇到的问题是,由于某种原因,第一个作业添加得很好,但是当我添加第二个作业时,第一个作业被部分删除。我尝试过多种复合算法,但如果它们有效,它们都有相同的问题。想知道是否有人可以指出我的逻辑缺陷。我附上了该过程各个阶段的一些示例。 任何帮助表示赞赏。谢谢。

/**
 * 
 * @param type $jig
 * @param type $point
 * @param string $original
 * @param string $additional
 */
public function addImageToImage($jig, $point, string $original, string $additional, string $jobBase)
{
    $preview = new Imagick();
    $preview->setResolution(300, 300);
    $preview->readImage($original);
    $jobImage = new Imagick();
    $jobImage->setResolution(300, 300);
    $jobImage->readImage($additional);
    $x = $this->mmToPx($jig["points"][$point][JigPoints::XCO] + $jig['products'][$jobBase][JigProducts::X_OFF]);
    $y = $this->mmToPx($jig["points"][$point][JigPoints::YCO] + $jig['products'][$jobBase][JigProducts::Y_OFF]);
    $preview->setImageBackgroundColor($jobImage->getImageBackgroundColor());
    $preview->setImageAlphaChannel($jobImage->getImageAlphaChannel());
    $preview->setImageType($jobImage->getImageType());
    $preview->compositeImage($jobImage,Imagick::COMPOSITE_DISSOLVE,$x,$y,$jobImage->getImageAlphaChannel());
    $preview->flattenImages();
    $preview->writeImage($original);
    $jobImage->destroy();
    $preview->destroy();
} 

php imagick composite merge-images
1个回答
0
投票

我找到了解决问题的方法。

显然,如果您在 imagick 中创建新图像,然后加载图像,则其行为与从现有图像创建新图像有很大不同。 我不确定为什么第一张图像的一部分总是在我的旧方法中被删除,但以下代码不会发生这种情况。

/**
 * 
 * @param type $jig
 * @param type $point
 * @param string $original
 * @param string $additional
 */
public function addImageToImage($jig, $point, string $original, string $additional, string $jobBase)
{
    $preview = new Imagick($original);
    $jobImage = new Imagick($additional);
    $x = $jig["points"][$point][JigPoints::XCO] + $jig['products'][$jobBase][JigProducts::X_OFF];
    $y = $jig["points"][$point][JigPoints::YCO] + $jig['products'][$jobBase][JigProducts::Y_OFF];
    $preview->compositeImage($jobImage,Imagick::COMPOSITE_OVER,$x,$y);
    $preview->writeImage($original);
    $jobImage->clear();
    $preview->clear();
}  
© www.soinside.com 2019 - 2024. All rights reserved.