maneira mais rápida para determinar a resolução da imagem e tipo de arquivo na linha de comando PHP ou Unix?
-
01-07-2019 - |
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
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 () .