GD でメモリエラー

GD でピクセルサイズの大きい JPEG や PNG などの画像を開こうとすると

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 6400 bytes) in …

のようにエラーが出ます。
例えばファイルサイズが 500KB 程度で php.ini の memory_limit に対して十分小さく見えても、ピクセルサイズが 1600×1200 のように極端に大きいとエラーになります。
 
原因は GD 内部でリソースとして読み込む際に、圧縮がとけるためのようです。
元画像のピクセルサイズが大きい程、読み込み時のサイズが大きくなる可能性が高くなるため、対策として php.ini で memoly_limit に十分な値を指定するだけでなく、GetImageSize() によりピクセルサイズをチェックするのが賢明です。

$size = filesize($file);
list($w, $h) = GetImageSize($file);
if($size > 1*1024*1024 || $w > 1200 || $h > 1200){
    throw new Exception(“ファイルサイズが大きすぎます”);
}

 
または、ImageMagick ならば同様のケースでもエラーなく処理ができるため、状況によって使いわけるといいでしょう。
 
参考:
BBS – PHP の基礎体力