Php检查图像是否为灰度函数内存泄漏

时间:2015-04-01 11:44:07

标签: php image-processing memory-leaks

我使用函数检查图像是否为灰度,文件路径和名称是否正确加载,有时运行正常。

然而,它开始给出通常的内存耗尽错误,所以我想知道造成这种情况的原因是什么?

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in ... on line 51

第51行是$b[$i][$j] = $rgb & 0xFF;

如何优化此功能以减少使用内存,可能只有一半的图像然后计算平均值或平均值太高?

function checkGreyscale(){

    $imgInfo = getimagesize($this->fileLocation);

    $width = $imgInfo[0];
    $height = $imgInfo[1];

    $r = array();
    $g = array();
    $b = array();

    $c = 0;

    for ($i=0; $i<$width; $i++) {

        for ($j=0; $j<$height; $j++) {

            $rgb = imagecolorat($this->file, $i, $j);

            $r[$i][$j] = ($rgb >> 16) & 0xFF;
            $g[$i][$j] = ($rgb >> 8) & 0xFF;
            $b[$i][$j] = $rgb & 0xFF;

            if ($r[$i][$j] == $g[$i][$j] && $r[$i][$j] == $b[$i][$j]) {
                $c++;
            }
        }
    }

    if ($c == ($width * $height))
        return true;
    else
        return false;
}

1 个答案:

答案 0 :(得分:1)

你确定在内存中需要整个表吗?

未经过快速测试:

function checkGreyscale(){

    $imgInfo = getimagesize($this->fileLocation);

    $width = $imgInfo[0];
    $height = $imgInfo[1];

    $r = $g = $b = 0; // defaulting to 0 before loop

    $c = 0;

    for ($i=0; $i<$width; $i++) {

        for ($j=0; $j<$height; $j++) {

            $rgb = imagecolorat($this->file, $i, $j);

            // less memory usage, its quite all you need
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;

            if( !($r == $g && $r == $b)) { // if not greyscale?
                return false; // stop proceeding ;)
            }
        }
    }

    return true;
}

这种方式不是将所有图像字节存储在内存中,而是将内存使用量增加一倍以上,而是仅使用大多数实际运行的字节集来进行计算。应该工作到你没有加载超过php内存限制的图像。