我不确定记忆是否是罪魁祸首。我试图从内存中的数据实例化GD图像(它以前来自数据库)。我尝试这样的电话:
my $image = GD::Image->new($image_data);
$image
以undef
的形式返回。对于GD的POD说,构造函数将返回undef
以查找内存不足的情况,这就是我怀疑内存的原因。
图像数据为PNG格式。如果我调用newFromPngData,也会发生同样的事情。
这适用于非常小的图像,例如30K以下。但是,像~70K这样稍大的图像会导致问题。我不认为70K图像会导致这些问题,即使它已经缩小了。
如果重要的话,这个脚本在OS 10.4下通过Apache 2.0在CGI下运行。
默认情况下Apache是否存在内存限制?他们可以增加吗?
感谢您的任何见解!
编辑:为了澄清,GD :: Image对象永远不会被创建,因此从内存中清除$image_data
实际上不是一种选择。
答案 0 :(得分:1)
GD库每个字节的图像大小占用很多字节。这是一个超过10:1的比例!
当用户将图像上传到我们的系统时,我们首先检查文件大小,然后再将其加载到GD图像中。如果超过阈值(1兆字节),我们不会使用它,而是向用户报告错误。
如果我们真的关心我们可以将其转储到磁盘,请使用命令行“convert”工具将其重新调整为合理的大小,然后将输出加载到GD库中并删除临时文件。
convert -define jpeg:size=800x800 tmpfile.jpg -thumbnail '800x800' -
将缩放图像,使其适合800 x 800平方。它的最长边缘现在是800px,应该可以安全地加载。上面的命令会将收缩的.jpg发送到STDOUT。 size =选项应该告诉转换不要在内存中保留巨大的图像,但只能扩展到800x800。
答案 1 :(得分:0)
我几次遇到同样的问题。
我的一个解决方案就是增加脚本可用的内存量。另一个是清除缓冲区:
原始剧本:
$src_img = imagecreatefromstring($userfile2);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_width,$thumb_height,$origw,$origh);
编辑脚本:
$src_img = imagecreatefromstring($userfile2);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_width,$thumb_height,$origw,$origh);
imagedestroy($src_img);
通过清除第一个src_image的内存,它释放得足以处理更多的处理。