我有一个问题,我认为很容易解决,但结果比预期的要困难一些。
我正在一个有人可以上传产品图片的网站上工作,并且它会动态调整两次(500x500和150x150)。我试图保持纵横比,例如,如果我有600x500图像,它会调整为500x417和150x125。
我找到了(很多)这样做的代码,例如this class,但是我总是遇到内存问题。我认为该类在调整大小后不会卸载/销毁临时图像。
我让主机将内存限制从32升级到64M,但是后来我的内存耗尽了。我也坚持使用PHP 5.2.13,所以我没有垃圾收集器。
我的PHP相当新,所以对我来说这是多么陌生的类,否则我会尝试在需要的地方添加imagedestroy()函数。我在连锁课上摆弄了几个小时没有成功。
任何人都可以:
- 指向一个魔术类的方向,在调整大小完成后保持方面以及卸载/销毁临时图像,以控制RAM的使用?
- 给我一些(非常需要的!)指导我可以在哪里以及如何修改类(例如发布的那个)来销毁临时图像。
- 告诉我,如果我出现这种极端错误的话?
哦,我让WideImage类在某一点工作,它工作得很好,然后突然停了下来。我花了好几个小时试图解决它没有成功。
我的PHP安装有GD,但不是ImageMagick。
谢谢!
答案 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
一种方法是这种技术:
imagedestroy($this->original_image)
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运行并提供了许多命令选项,确保您可以使用其中之一或两者并不困难。