在图片上叠加数据的正确方法?

The right approach to overlay data on the picture?

有一个 class 用于在用户栏上呈现数据。

它工作正常,但我想澄清一下。在此过程中,数据叠加在图像上,您应该对 ImagickImagickDraw 使用 clone - 以保存之前的叠加。

private function createImage($file): Imagick
{
    $this->Imagick = new Imagick(__DIR__.'/Draw/Images/'.$file);
    return $this->Imagick;
}

如何使用 clone 的示例:

private function drawRank(): Imagick
{
    $image = clone $this->Imagick;
    $rank = $this->createImage(self::RANK_IMAGE);
    $rank->cropImage(32, 32, 0, $this->vector[$this->interface->rank_id]);
    $image->compositeImage($rank, Imagick::COMPOSITE_DEFAULT, 64, 18);
    return $image;
}

最后变成了这样:

private function call()
{
    $this->Imagick = $this->createImage(self::BACKGROUND_IMAGE[$this->l]);
    $this->Imagick = $this->drawRank();
    $this->Imagick = $this->drawingProfile();

    header('Content-Type: image/'.$this->Imagick->getImageFormat());
    echo $this->Imagick;
}

这有多正确?我对这种方法有疑问。这是正常做法吗?

逻辑错误:

      A=1  
      A=2  
      A=3  
      here A=3, value 1 and 2 are lost !

试试这个方法

$im1 = $this->createImage(self::BACKGROUND_IMAGE[$this->l]);
$im2 = $this->drawRank();
$im3 = $this->drawingProfile();

然后用 compositeImage 合成最终图像

   // assuming transparent color is used in im2 and im3 
   // compose with image 2
   $im1->compositeImage ($im2, Imagick::COMPOSITE_DEFAULT,0,0, Imagick::CHANNEL_ALPHA);
   // compose with image 3
   $im1->compositeImage ($im3, Imagick::COMPOSITE_DEFAULT,0,0, Imagick::CHANNEL_ALPHA);