从imagemagick对象清除并销毁新的克隆,怎么样?

时间:2013-06-29 23:08:31

标签: imagemagick

这是我的代码的模型,而不是完整的代码...但足以提出以下问题:

当我创建一个imagemagick对象的克隆时,我是否必须清除并销毁该对象,或者只是第一个。换句话说,在我的模型代码中,我是否还需要在foreach循环中销毁 $ clone ,或者在循环外部 $ im ,或者两者兼而有之?

由于

function create_clone($size, $filename, $filepath)
{
   $thumb = array();
   $dir = get_dir($filename); //validate directory to write clones

   if (isset($dir)) {
      $im = new imagick($filepath);

      //create sizes of same image
      foreach ($size as $value) {
         $clone = $im->clone();

         //create clone
      }

      $im->clear();
      $im->destroy();
   }

   return $thumb;
}

1 个答案:

答案 0 :(得分:0)

Imagick::clear()Imagick::destroy()变换了相同的ClearMagickWand方法,因此您只需调用一个即可释放已分配的资源。您需要清除或销毁foreach循环中的每个克隆对象。这是因为克隆只会制作对象的精确副本。清除原始资源不会释放分配给另一个对象的相同资源。

$im = new imagick($filepath);

foreach ($size as $value) {
  $clone = $im->clone();

  // Do work

  $clone->clear();
}

$im->clear();

此外,您应该使用clone关键字作为method has been deprecated

<?php

  // Initialize image object
  $img = new Imagick($resource);

  // Exact copy of object + data resources
  $imgCopy = clone $img;

  // Compare resource of two objects
  var_dump($img->getImageBlob() === $imgCopy->getImageBlob());
  //=> bool(true)

  // Free original object
  $img->destroy();

  // Verify original object is empty
  var_dump($img->getImageBlob());
  //=> Warning: Uncaught exception 'ImagickException' with message 'Can not process empty Imagick object'

  // Verify copied object's resources are still allocated
  var_dump($imgCopy->getImageBlob());
  //=> string(342) "?PNG\r\n\032\n\000\000\000\rIHDR .... IEND?B`?"