Der schnellste Weg, Bildauflösung und Dateityp in PHP oder Unix-Kommandozeile zu bestimmen?

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

Frage

Ich bin derzeit mit ImageMagick die Größe der Bilder auf die Website hochgeladen zu bestimmen. Durch den Aufruf es ImageMagicks „identifizieren“ auf der Kommandozeile etwa 0,42 Sekunden dauert, zusammen mit der Tatsache eines 1MB JPEG Dimensionen zu bestimmen, dass es sich um eine JPEG ist. Ich finde, dass ein bisschen langsam.

die Imagick PHP-Bibliothek zu verwenden ist noch langsamer, da sie versucht sich die ganze 1MB in den Speicher zu laden, bevor sie eine Behandlung mit dem Bild zu tun (in diesem Fall einfach die Größe und die Art zu bestimmen).

Gibt es Lösungen, diesen Prozess zu beschleunigen, zu bestimmen, welche Dateitypen und die eine beliebige Bilddatei Dimensionen? Ich kann damit leben nur JPEG und PNG unterstützt. Es ist mir wichtig, dass der Dateityp, indem Sie auf dem Datei-Header und nicht nur die Erweiterung bestimmt wird.

Edit: Die Lösung kann ein Kommandozeilen-Tool UNIX von PHP, ähnlich wie die Art und Weise genannt wird ich ImageMagick im Moment bin mit

War es hilfreich?

Lösung

Leider kann ich nicht hinzufügen, als Kommentar zu einer früheren Antwort, aber ich habe nicht die rep. Ich fand auch, dass exec einige quick and dirty-Tests zu tun ( "identifizieren -ping ... ist etwa 20-mal schneller als ohne den -ping. Aber getimagesize () erscheint noch etwa 200-mal schneller sein.

Also ich würde sagen getimagesize () ist die schnellere Methode. Ich habe nur auf jpg getestet und nicht auf png.

ist der Test nur

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

Andere Tipps

Wenn Sie PHP mit GD-Unterstützung verwenden, können Sie versuchen, getimagesize ( ) .

Haben Sie versucht,

identify -ping filename.png

  

Es ist mir wichtig, dass der Dateityp, indem Sie auf dem Datei-Header und nicht nur die Erweiterung bestimmt wird.

Für das können Sie ‚Datei‘ verwenden Unix-Befehl (orsome PHP-Funktion, die die gleiche Funktionalität implementiert).

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

Eigentlich verwenden getimagesize (), die Sie tun nicht , müssen sie GD kompiliert in.

Sie können auch mime_content_type () verwenden, den MIME-Typ zu erhalten.

exif_imagetype () schneller als getimagesize ().

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

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

Ausgabe:

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

Wenn Sie PHP verwenden würde ich vorschlagen, die Imagick Bibliothek statt exec() aufrufen. Das Feature Sie suchen ist Imagick :: pingImage () .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top