2

可能重复:
PHP 重建图像:内存使用

我有一个简单的图片上传脚本。允许用户上传最大文件大小为 10MB 的图像(gif、jpg 或 png)。用户还可以对图像应用裁剪,因此我将脚本的内存限制设置为 256MB。我认为 256MB 的内存足以裁剪 10MB 的图像。我错了。当用户上传一张大图像(大约 5000x5000)并且几乎没有裁剪它时,脚本总是会抛出内存不足的错误。我发现这个简洁的工具可以帮助确定使用 php 调整图像大小时的内存限制。我也遇到过这个公式

$width * $height * $channels * 1.7

以确定图像需要多少内存。我正在找人解释这里发生了什么。我很清楚 10MB jpeg 在加载到内存时不是 10MB,但是我如何确定它将占用多少内存?上面的公式正确吗?有没有更有效的方法来裁剪大图像,还是我必须使用大量内存?

对于任何感兴趣的人,这里是裁剪图像的代码。

function myCropImage(&$src, $x, $y, $width, $height) {
    $src_width = imagesx($src);
    $src_height = imagesy($src);

    $max_dst_width = 1024;
    $dst_width = $width;

    $dst_height = $height;
    $max_dst_height = 768;

    // added to restrict size of output image.
    // without this check an out of memory error is thrown.
    if($dst_width > $max_dst_width || $dst_height > $max_dst_height) {
        $scale = min($max_dst_width / $dst_width, $max_dst_height  / $dst_height);
        $dst_width *= $scale;
        $dst_height *= $scale;
    }

    if($x < 0) {
        $width += $x;
        $x = 0;
    }
    if($y < 0) {
        $height += $y;
        $y = 0;
    }

    if (($x + $width) > $src_width) {
        $width = $src_width - $x;
    }

    if (($y + $height) > $src_height) {
        $height = $src_height - $y;
    }

    $temp = imagecreatetruecolor($dst_width, $dst_height);
    imagesavealpha($temp, true);
    imagefill($temp, 0, 0, imagecolorallocatealpha($temp, 0, 0, 0, 127));
    imagecopyresized($temp, $src, 0, 0, $x, $y, $dst_width, $dst_height, $width, $height);

    return $temp;
}
4

0 回答 0