我几乎总是在网站上为我的客户提供PHP调整大小脚本(使用GD)。无论我多少次告诉他们在上传之前从他们的数码相机调整巨大的7MP图像,他们仍然永远不会这样做。结果是来自服务器的“内存不足”错误,并且图像没有调整大小,因为原始图像的分辨率太大。
有没有更好的方法来调整真正大图像的大小?是否有提供API的服务,我可以通过我的脚本来调整这些大图像的大小?
答案 0 :(得分:3)
您可以调用Imagemagick来调整php页面中的图片大小,但如果您允许系统调用则会出现安全问题
任何API都会使用大量内存,你也可以更改你的php memory_limit。
答案 1 :(得分:3)
如果您的PHP配置中有可用的ImageMagick API,请使用它! ImageMagick不会在PHP memory_limit
中计算,因此可以使用更大的文件。
如果你真的无法控制服务器,那么快速和非常糟糕的解决方法是 - 从$ _POST获取图像文件后,首先检查维度:
<?php
$image_size = getimagesize("yourfile.jpg")
$mem_usage = $image_size[0] * $image_size[1] * 4 //4 bytes per pixel (RGBA)
if ($mem_usage > $mem_aviable) {
die ('Please upload smaller pic. I tell you that all the time. '.
'Resize yout huge 7MP images from your digital camera '.
'before uploading them.'); //Better put something more polite here.
}
答案 2 :(得分:2)
我因这个问题而被困了几天(和晚上)。
此外,提供商的内存限制因人而异。
并且更改PHP中的memory_limit
在共享服务器上不起作用,即使phpinfo()
表示您有128Mo(例如,1和1限制RAM到每个进程60Mo),提供程序通常会限制ram。
但我终于在这里找到了一些非常有效的东西:http://www.imagemagick.org/Usage/files/#massive
它需要imagemagick
,但我发现大多数提供商本身都在其服务器上提供此功能,甚至是共享服务器。
exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg');
正如它所说:
env MAGICK_TMPDIR=<tmp_dir>
为imagemagick设置临时目录
模拟ram(种类)
nice -5
也是一个用于更改进程优先级的unix命令
(http://en.wikipedia.org/wiki/Nice_(Unix))
convert ...
是imagemagick命令行
实际交易大约是-limit memory 32
和-limit map 32
。这是限制二进制文件使用的内存的方式(此处:32Mo)。您可能需要调整值以匹配服务器的值(通常,PHP会告诉您在给出致命错误时分配的最大内存。我建议您将此值除以2或4以使其更加舒适)。
我还需要在我的PHP中添加一些其他行以避免一些附带问题:
ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts
set_time_limit(0); // ignore server timeout
putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case
希望所有这一切都有帮助...
要知道服务器上是否有convert
可用,您可以尝试使用此功能(在PHP中):
$out = array();
exec('which convert 2>&1', $out);
print_r($out);
这将为您提供二进制文件的路径(如果存在)。
答案 3 :(得分:1)
您可以使用convert
来支持外部程序答案 4 :(得分:1)
如何上传然后排队调整大小的作业,命令行php脚本然后可以选择并处理(更快,可以有一个单独的内存限制和执行时间)
答案 5 :(得分:1)
只需让它们在上传之前调整它的大小。 MAX_FILE_SIZE
答案 6 :(得分:0)
我花了一些时间尝试调试直接使用GD的PHP代码,但在大图像和图像子集上失败,这些图像似乎有轻微的错误导致GD窒息。
但后来我找到了phpThumb(http://phpthumb.sourceforge.net/),我永远不会回去。将两个PHP文件添加到我的Web目录(phpthumb.class.php
和phpthumb.functions.php
)后,我可以使用以下代码生成缩略图:
include("phpthumb.class.php");
// Load data into phpThumb object and set parameters
$phpThumb = new phpThumb();
$phpThumb->setSourceData(file_get_contents($_GET['filename']));
$phpThumb->setParameter('w', $width); // Set width
$phpThumb->setParameter('h', $height); // Set height
$phpThumb->setParameter('zc', 1); // Specify zoom-crop (instead of stretch)
$phpThumb->setParameter('q', 100); // Specify quality
// Generate & output thumbnail
$phpThumb->GenerateThumbnail(); // Generate the thumbnail
$phpThumb->OutputThumbnail(); // Output it to browser
$phpThumb->RenderToFile("$thumbname"); // Output it to file
$phpThumb->purgeTempFiles(); // Clean up
Boom,就像魅力一样,速度非常快,对大文件也没有问题。此外,它可以使用GD或ImageMagick,具体取决于服务器上的可用内容,因此它相对便携。