Il modo più veloce per determinare la risoluzione dell'immagine e il tipo di file nella riga di comando PHP o Unix?

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

Domanda

Attualmente sto utilizzando ImageMagick per determinare la dimensione delle immagini caricate sul sito web.Chiamando "identifica" di ImageMagick sulla riga di comando sono necessari circa 0,42 secondi per determinare le dimensioni di un JPEG da 1 MB insieme al fatto che si tratta di un JPEG.Lo trovo un po' lento.

L'uso della libreria PHP Imagick è ancora più lento in quanto tenta di caricare l'intero 1 MB di memoria prima di eseguire qualsiasi trattamento sull'immagine (in questo caso, determinandone semplicemente la dimensione e il tipo).

Esistono soluzioni per accelerare questo processo di determinazione del tipo di file e delle dimensioni di un file immagine arbitrario?Posso conviverci supportando solo JPEG e PNG.Per me è importante che il tipo di file venga determinato osservando le intestazioni del file e non semplicemente l'estensione.

Modificare:La soluzione può essere uno strumento da riga di comando UNIX chiamato da PHP, proprio come sto usando ImageMagick al momento

È stato utile?

Soluzione

Mi dispiace, non posso aggiungere questo come commento a una risposta precedente ma non ho il rappresentante.Facendo alcuni test rapidi e sporchi ho anche scoperto che exec("identify -ping...è circa 20 volte più veloce che senza -ping.Ma getimagesize() sembra essere ancora circa 200 volte più veloce.

Quindi direi che getimagesize() è il metodo più veloce.Ho testato solo su jpg e non su png.

la prova è giusta

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

Altri suggerimenti

Se stai utilizzando PHP con il supporto GD, puoi provare ottieni dimensione immagine().

Hai provato

identify -ping filename.png

?

Per me è importante che il tipo di file venga determinato osservando le intestazioni del file e non semplicemente l'estensione.

Per questo puoi usare il comando unix 'file' (o qualche funzione php che implementa la stessa funzionalità).

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

In realtà, per usare getimagesize(), lo fai NON è necessario compilare GD.

Puoi anche usare mime_content_type() per ottenere il tipo MIME.

Exif_imagetype() è più veloce di getimagesize().

$nomefile = "qualchefile";
$dati = tipo_immagine_exif($nomefile);
echo "<PRE>";
stampa_r($dati);
echo "</PRE>";

produzione:

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 utilizzi PHP, suggerirei di utilizzare la libreria Imagick anziché chiamare exec().La funzionalità che stai cercando è Imagick::pingImage().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top