2015-04-01 2 views
2

Я использую функцию, чтобы проверить, имеет ли изображение оттенки серого или нет, пути и имена файлов загружаются правильно, а иногда они работают нормально.Php проверить, является ли изображение серым цветом ошибка памяти памяти

Однако он начал приносить обычную память измученным ошибкам, поэтому мне интересно, что это вызывает?

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

Вы уверены, что вам нужна целая таблица в памяти?

Не тестировался халтура:

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; 
} 

таким образом, вместо того, чтобы хранить все байты изображения в памяти, Prolly более чем в два раза использование памяти, вы используете только самую актуальную набор байтов выполнявшимися расчеты. Должен работать, насколько вы не загружаете изображение, превышающее ограничение памяти php.

+1

Я бы подумал, что было бы лучше проверить, если '$ r',' $ g' и '$ b' не равны, а затем немедленно возвращаются, если нет, - нет точки, проверяющей остальное, как только один пиксель isn ' t серый - он должен быть быстрее, чем всегда проверять все. –

Смежные вопросы