Le moyen le plus rapide de déterminer la résolution de l’image et le type de fichier en ligne de commande PHP ou Unix?

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

Question

J'utilise actuellement ImageMagick pour déterminer la taille des images téléchargées sur le site Web. En appelant & Quot; identifier & Quot; d'ImageMagick sur la ligne de commande, il faut environ 0,42 seconde pour déterminer les dimensions d’un fichier JPEG de 1 Mo et le fait qu’il s’agit d’un fichier JPEG. Je trouve cela un peu lent.

L'utilisation de la bibliothèque PHP de Imagick est encore plus lente, car elle tente de charger la totalité de 1 Mo en mémoire avant de traiter l'image (dans ce cas, il suffit de déterminer sa taille et son type).

Existe-t-il des solutions pour accélérer ce processus de détermination du type de fichier et des dimensions d’un fichier image arbitraire? Je peux vivre avec seulement en supportant JPEG et PNG. Il est important pour moi que le type de fichier soit déterminé en regardant les en-têtes du fichier et pas simplement son extension.

Modifier: la solution peut être un outil de ligne de commande UNIX appelé par PHP, un peu comme j'utilise ImageMagick pour le moment

Était-ce utile?

La solution

Désolé, je ne peux pas ajouter ceci en tant que commentaire à une réponse précédente, mais je n'ai pas le représentant. En effectuant des tests rapides et sales, j’ai également constaté que exec (& "; Identifier -ping ... est environ 20 fois plus rapide que sans -ping. Mais getimagesize () semble être environ 200 fois plus rapide.

Je dirais donc que getimagesize () est la méthode la plus rapide. J'ai seulement testé sur jpg et non sur png.

le test est juste

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

Autres conseils

Si vous utilisez PHP avec le support GD, vous pouvez essayer getimagesize ( ) .

Avez-vous essayé

identify -ping filename.png

?

  

Il est important pour moi que le type de fichier soit déterminé en regardant les en-têtes du fichier et non simplement son extension.

Pour cela, vous pouvez utiliser la commande unix 'file' (ou une fonction php qui implémente les mêmes fonctionnalités).

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

En fait, pour utiliser getimagesize (), PAS , vous devez disposer de GD compilé.

Vous pouvez également utiliser mime_content_type () pour obtenir le type MIME.

exif_imagetype () est plus rapide que getimagesize ().

$ filename = " un fichier " ;;
$ data = exif_imagetype ($ filename);
echo " < PRE > " ;;
print_r ($ data);
echo " < / PRE > " ;;

sortie:

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
        )
)

Si vous utilisez PHP, je vous suggérerais d'utiliser la bibliothèque Imagick plutôt que d'appeler exec(). La fonctionnalité que vous recherchez est Imagick :: pingImage () .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top