Verificando se não vai estourar a memória usando a GDLib

PHP
Enviado por DeCo em Ter, 28/03/2006 - 20:44.PHP

É uma verificação simples, porém ninguém faz. Todos se preucupam com o tamanho do arquivo em kb ou as dimensões. Mas e a memória? Será que o PHP aguenta? Por default, o PHP pode usar 8mb por execução. Para manipular imagens isso é pouco... Geralmente se usa a GDLib para gerar thumbs, redimencionar e baixar a qualidade para não ocupar espaço em disco. Mas o peso em kb não tem nenhuma relação com a imagem "real" em memória, afinal, no disco ela está comprimida em algum formato (jpg, gif, png) e em memória é jogada ponto a ponto (bitmap).

Fiz uma imagem PNG que resultou em 96kb em disco, maravilha...
Em memória ocupava 205mb, as dimensões eram 3000 × 3000 pixels e estava em 24 bits.

A fórmula para saber o quanto uma imagem ocupa em memória é bem simples,
basta multiplicar a altura pela largura em pixels vezes os bits (8 bits, 16 bits, 24 bits, 32 bits... bits não é a paleta indexada, a paleta é em relação a compressão).

memoria = width * height * bits

Exemplo:

  1. <?php
  2. // arquivo a ser aberto
  3. $file = 'test.png';
  4.  
  5. // limite de uso da memória para abrir a imagem
  6. $limit = 8388608; // 8mb
  7.  
  8. // pega as informações sobre o tamanho da imagem
  9. $size = getimagesize($file);
  10.  
  11. // espaço que ocupa em memória (formula: memoria = width * height * bits)
  12. $alloc = $size[0] * $size[1] * $size['bits'];
  13.  
  14. // arquivo maior que permitido em memória, não pode ser manipulado
  15. if ($alloc > $limit) {
  16.     echo 'A imagem não pode ser aberta na gdlib';
  17. } else {
  18.     // abre o arquivo na gdlib :D
  19.     // gera thumbs e zaz
  20. }
  21. ?>

Não coloque toda a memória disponível, afinal o script consome memória. Lembre-se também que ao abrir duas imagens, as duas vão estar na memória, então, sempre libere elas com as funções da GDLib antes de abrir outra.