maneira mais rápida para determinar a resolução da imagem e tipo de arquivo na linha de comando PHP ou Unix?

StackOverflow https://stackoverflow.com/questions/90758

Pergunta

Atualmente estou usando o ImageMagick para determinar o tamanho das imagens enviadas para o site. Chamando ImageMagick de "identificar" na linha de comando que leva cerca de 0,42 segundos para determinar as dimensões de um 1MB JPEG, juntamente com o fato de que é um JPEG. Acho que um pouco lento.

Usando a biblioteca Imagick PHP é ainda mais lento, uma vez que attemps para carregar toda a 1 MB de memória antes de fazer qualquer tratamento para a imagem (neste caso, simplesmente determinar seu tamanho e tipo).

Há alguma solução para acelerar este processo de determinar qual o tipo de arquivo e quais dimensões um arquivo de imagem arbitrária tem? Eu posso viver com isso só apoiar JPEG e PNG. É importante para mim que o tipo de arquivo é determinado por olhar para os cabeçalhos do arquivo e não simplesmente a extensão.

Edit: A solução pode ser uma ferramenta de linha de comando UNIX chamado por PHP, bem como a maneira que estou usando ImageMagick no momento

Foi útil?

Solução

Desculpe eu não posso adicionar isso como um comentário a uma resposta anterior, mas eu não tenho o representante. Fazendo algumas rápido e testando sujo Eu também achei que exec ( "identificar -ping ... é cerca de 20 vezes mais rápido do que sem a -ping. Mas getimagesize () parece ser de cerca de 200 vezes mais rápido ainda.

Então, eu diria getimagesize () é o método mais rápido. Eu só testado em jpg e não em png.

o teste é apenas

$files = array('2819547919_db7466149b_o_d.jpg', 'GP1-green2.jpg', 'aegeri-lake-switzerland.JPG');
foreach($files as $file){
  $size2 = array();
  $size3 = array();
  $time1 = microtime();
  $size = getimagesize($file);
  $time1 = microtime() - $time1;
  print "$time1 \n";
  $time2 = microtime();
  exec("identify -ping $file", $size2);
  $time2 = microtime() - $time2;
  print $time2/$time1 . "\n";
  $time2 = microtime();
  exec("identify $file", $size3);
  $time2 = microtime() - $time2;
  print $time2/$time1 . "\n";
  print_r($size);
  print_r($size2);
  print_r($size3);
}

Outras dicas

Se você estiver usando PHP com suporte ao GD, você pode tentar getimagesize ( ) .

Você tentou

identify -ping filename.png

?

É importante para mim que o tipo de arquivo é determinado por olhar para os cabeçalhos do arquivo e não simplesmente a extensão.

Para que você pode usar 'arquivo' comando unix (orsome função PHP que implemente a mesma funcionalidade).

/tmp$ file stackoverflow-logo-250.png
stackoverflow-logo-250.png: PNG image data, 250 x 70, 8-bit colormap, non-interlaced

Na verdade, para usar getimagesize (), você não necessidade de ter GD compilada.

Você também pode usar mime_content_type () para obter o tipo MIME.

exif_imagetype () é mais rápido que getimagesize ().

$ filename = "somefile";
$ Dados = exif_imagetype ($ filename);
echo "

"; 
print_r ($ data);
echo "
";

saída:

Array (
        [FileName] => somefile
        [FileDateTime] => 1234895396
        [FileSize] => 15427
        [FileType] => 2
        [MimeType] => image/jpeg
        [SectionsFound] => 
        [COMPUTED] => Array
            (
                [html] => width="229" height="300"
                [Height] => 300
                [Width] => 229
                [IsColor] => 1
        )
)

Se você estiver usando PHP eu sugiro usar a biblioteca Imagick ao invés de chamar exec(). O recurso que você está procurando Imagick :: pingImage () .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top