减少用于图像大小调整的php内存使用量

时间:2011-01-06 20:07:53

标签: php image memory memory-management resize

我目前正在创建一个PHP网站,用户需要能够上传图像,然后需要调整大小到合理的大小。我的php配置设置为50mb的内存限制。

问题是当上传大约5mb的图像时,php无法调整图像大小(由于大量内存使用)。所以我想知道是否还有优化调整大小图像的内存使用量。这是我目前使用的:

class Image {


  var $uploaddir;
  var $quality = 80;
  var $ext;
  var $dst_r;
  var $img_r;
  var $img_w;
  var $img_h;
  var $output;
  var $data;
  var $datathumb;

  function setFile($src = null) {
   $this->ext = strtoupper(pathinfo($src, PATHINFO_EXTENSION));
   if(is_file($src) && ($this->ext == "JPG" OR $this->ext == "JPEG")) {
    $this->img_r = ImageCreateFromJPEG($src);
   } elseif(is_file($src) && $this->ext == "PNG") {
    $this->img_r = ImageCreateFromPNG($src);      
   } elseif(is_file($src) && $this->ext == "GIF") {
    $this->img_r = ImageCreateFromGIF($src);
   }
   $this->img_w = imagesx($this->img_r);
   $this->img_h = imagesy($this->img_r);
  }

  function resize($largestSide = 100) {
    $width = imagesx($this->img_r);
    $height = imagesy($this->img_r);
    $newWidth = 0;
    $newHeight = 0;

    if($width > $height){
      $newWidth = $largestSide;
      $newHeight = $height * ($newWidth / $width);
    }else{
      $newHeight = $largestSide;
      $newWidth = $width * ($newHeight / $height);
    }

   $this->dst_r = ImageCreateTrueColor($newWidth, $newHeight);
   imagecopyresampled($this->dst_r, $this->img_r, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
   $this->img_r = $this->dst_r;
   $this->img_h = $newHeight;
   $this->img_w = $newWidth;
  }

  function createFile($output_filename = null) {
   if($this->ext == "JPG" OR $this->ext == "JPEG" OR $this->ext == "PNG" OR $this->ext == "GIF") {
    imageJPEG($this->dst_r, $this->uploaddir.$output_filename.'.'."jpg", $this->quality);
   } /*elseif($this->ext == "PNG") {
    imagePNG($this->dst_r, $this->uploaddir.$output_filename.'.'.$this->ext);
   } elseif($this->ext == "GIF") {
    imageGIF($this->dst_r, $this->uploaddir.$output_filename.'.'.$this->ext);
   }*/
   $this->output = $this->uploaddir.$output_filename.'.'.$this->ext;
  }

  function setUploadDir($dirname) {
   $this->uploaddir = $dirname;
  }

  function flush() {
   $tempFile = $_FILES['Filedata']['tmp_name'];
   $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
   $targetFile = str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];

   imagedestroy($this->dst_r);
   unlink($targetFile);
   imagedestroy($this->img_r);

  }

然后我要调整大小:

  $tempFile = $_FILES['Filedata']['tmp_name'];
  $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
  $targetFile =  str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];

  move_uploaded_file ($tempFile, $targetFile);

  $image = new Image();
  $image->setFile($targetFile);
  $image->setUploadDir($targetPath);
  $image->resize(200);
  $image->createFile(md5($id));
  $image->flush();

我目前正在使用uploadify,但它使用此上传/调整大小脚本。是否有优化此代码,以便它使用更少的内存?

谢谢:)

4 个答案:

答案 0 :(得分:2)

一个5000 x 5000像素的图像在300DPI时为16.7英寸,这将是5.2 Mb。您可能想对图像尺寸设置一些合理的期望,比如大约1000万像素?

一个1400万像素的图像尺寸为4672 x 3104,因为JPEG符合5 Mb的图像尺寸限制。

还可以通过使用像imagecreate这样的托盘方法来查看是否有足够的内存节省,而不是使用imagecreatetruecolor。

php网站上也有一些帮助,可以根据图像大小确定你的内存需求here

答案 1 :(得分:0)

务实的做法是只调用一个外部程序,例如ImageMagick进行大小调整。

答案 2 :(得分:0)

对于网站上的图像,5 Mb是非常大的尺寸。如果应用程序允许和/或需要更大的文件,可能值得质疑。

答案 3 :(得分:0)

您是否知道使用imagecreatefromjpeg打开文件比使用file_get_contents打开第一个文件要少得多 - 然后使用imagecreatefromstring

另外,我会将文件上传限制为2-4MB。人们没有理由浪费你的带宽发送大量文件。