4

我有这个简单的 PHP 脚本,它只包含以下几行

$mem = memory_get_usage()/1024;
$mem = $mem/1024;
echo "mem: ".$mem ."Mb<br>";
$max =  ini_get('memory_limit');
echo "max is $max<br>";

$filename = 'upload/orig/CID_553.jpg';              
$filesize = (filesize($filename) / 1024);
echo "filesize is $filesize Kb<br>";        
$img_pointer = imagecreatefromjpeg($filename);

运行它时,我得到这个输出

mem: 0.30711364746094Mb
max is 64M
filesize is 952.2666015625 Kb
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 13056 bytes) in C:\temp_checkmem.php on line 13 

加载 952Kb 的文件怎么可能使 PHP (imagecreatefrompeg) 超出允许的 64Mb 内存?有任何想法吗?

4

2 回答 2

8

仅仅因为 JPG 文件只有 952kbytes 并不意味着它不能占用非常大的内存,例如使用 2048x2048 纯白色图像进行简单测试会产生 59kbyte 的 .jpg 文件。

该文件将解压缩为2048x2048x3 = 12.6GD 中的兆字节原始位图。

您可以粗略估计 GD 需要多少内存来加载/解压缩图像:

$stats = getimagesize($filename);
$memory_estimate = $stats[0] * $stats[1] * 3; // height * width * 3 bytes per pixel
echo "{$stats[0]}x{$stats[1]} -> {$memory_estimate} bytes";
于 2013-06-25T15:41:29.130 回答
1

原始图片或图片的内部格式可能会超过内存限制。

尝试加载一张大图并将其保存为位图,它很大..

每个像素占用 3 个字节(24 位颜色模式)0-255 red 0-255 green,, 0-255 blue.

在打开带有附加 alpha 通道的文件时imagealphablending();,每个像素有 4 个字节(32 位颜色模式),从而产生额外的0-255 for alpha blending.

2,5 MB JPG (100% quality) ~ 36,0 MB bitmap - 12 megapixel    
4,1 MB JPG (100% quality) ~ 96,0 MB bitmap - 32 megapixel

与此工具进行比较:

http://web.forret.com/tools/megapixel.asp

见维基百科:

http://en.wikipedia.org/wiki/True_Color#True_color_.2824-bit.29

于 2013-06-25T15:42:03.633 回答