通过PHP调整大量图像,保持方面而不是使用我的所有RAM?

时间:2012-05-23 14:46:02

标签: php memory-management image-resizing aspect-ratio

我有一个问题,我认为很容易解决,但结果比预期的要困难一些。

我正在一个有人可以上传产品图片的网站上工作,并且它会动态调整两次(500x500和150x150)。我试图保持纵横比,例如,如果我有600x500图像,它会调整为500x417和150x125。

我找到了(很多)这样做的代码,例如this class,但是我总是遇到内存问题。我认为该类在调整大小后不会卸载/销毁临时图像。

我让主机将内存限制从32升级到64M,但是后来我的内存耗尽了。我也坚持使用PHP 5.2.13,所以我没有垃圾收集器。

我的PHP相当新,所以对我来说这是多么陌生的类,否则我会尝试在需要的地方添加imagedestroy()函数。我在连锁课上摆弄了几个小时没有成功。

任何人都可以:

- 指向一个魔术类的方向,在调整大小完成后保持方面以及卸载/销毁临时图像,以控制RAM的使用?

- 给我一些(非常需要的!)指导我可以在哪里以及如何修改类(例如发布的那个)来销毁临时图像。

- 告诉我,如果我出现这种极端错误的话?

哦,我让WideImage类在某一点工作,它工作得很好,然后突然停了下来。我花了好几个小时试图解决它没有成功。

我的PHP安装有GD,但不是ImageMagick。

谢谢!

3 个答案:

答案 0 :(得分:1)

好吧,我设法解决了自己的问题。

我坐下来,擦掉所有调整大小的代码,然后从头开始,写下这个很棒的小功能来做我需要的。

function resizeimage($targetw, $targeth, $input, $savedest) {
    list($oldw, $oldh) = getimagesize($input);
    $imgratio = ($oldw / $oldh);
     if ($imgratio>1) { 
         $new_width = $targetw; 
         $new_height = ($targeth / $imgratio); 
     } else { 
         $new_height = $targeth; 
         $new_width = ($targetw* $imgratio); 
     }
  $imagetemp = imagecreatetruecolor($new_width, $new_height);
  $imageorig = imagecreatefromjpeg($input);
  imagecopyresampled($imagetemp, $imageorig, 0, 0, 0, 0, $new_width, $new_height, $oldw, $oldh);
  imagejpeg($imagetemp, $savedest, 95);
  imagedestroy($imageorig);
  imagedestroy($imagetemp);
  unset($oldw,$oldh,$imgratio,$new_height, $new_width, $imagetemp, $imageorig);
}

输入目标宽度和高度,以及输入图像的位置(例如“uploads / images / testimage.jpg”),以及保存位置(“uploads / images / resizedtestimage.jpg”)。

希望此片段可以帮助将来的某个人!

答案 1 :(得分:0)

以下是一些GD图像处理示例: http://fdcl.svn.sourceforge.net/viewvc/fdcl/trunk/modules/imageprocessing/gd/module.inc?revision=212&view=markup

一种方法是这种技术:

  • 打开图像缩放至500
  • imagedestroy($this->original_image)
  • 使用缩放到500的图像并缩小到150
  • imagedestroy($this->image500)
  • imagedestroy($this->image150)

最后一个想法是使用任何可用的命令行工具为您调整大小。

答案 2 :(得分:0)

我做了类似的事情,但使用了2个可以在Linux服务器上从命令行运行的应用程序。

ImageMagick Mogrify:http://www.imagemagick.org/www/mogrify.html

mogrify -resize 750 "image.jpg" 

将调整为750像素宽

jpegoptim:http://freecode.com/projects/jpegoptim

jpegoptim "image.jpg" –max=70 --strip-all

将jpeg优化为70%并从图像中去除所有不必要的膨胀。

两者都从CLI运行并提供了许多命令选项,确保您可以使用其中之一或两者并不困难。