2008-09-18 11 views
5

Ich verwende derzeit ImageMagick, um die Größe der auf die Website hochgeladenen Bilder zu bestimmen. Wenn man ImageMagicks "identify" auf der Kommandozeile aufruft, dauert es etwa 0,42 Sekunden, um eine 1MB JPEG-Größe zu bestimmen, zusammen mit der Tatsache, dass es sich um ein JPEG handelt. Ich finde das ein bisschen langsam.Schnellste Möglichkeit zur Bestimmung der Bildauflösung und des Dateityps in der PHP- oder Unix-Befehlszeile?

Die Verwendung der Imagick PHP-Bibliothek ist noch langsamer, da versucht wird, die gesamten 1 MB im Speicher zu laden, bevor das Bild bearbeitet wird (in diesem Fall einfach Größe und Typ bestimmen).

Gibt es Lösungen, um diesen Vorgang zu beschleunigen, um festzustellen, welcher Dateityp und welche Dimensionen eine beliebige Bilddatei hat? Ich kann damit leben und nur JPEG und PNG unterstützen. Es ist mir wichtig, dass der Dateityp anhand der Header der Datei und nicht nur der Erweiterung ermittelt wird.

Edit: Die Lösung kann ich im Moment

Antwort

3

Sorry Ich kann dies nicht als Kommentar zu einer vorherigen Antwort hinzufügen, aber ich habe nicht die rep. Ich habe auch festgestellt, dass exec ("identify -ping ... ist etwa 20-mal schneller als ohne -ping. Aber getimagesize() scheint immer noch etwa 200-mal schneller.

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

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); 
} 
+0

Aber bietet GD eine Möglichkeit, einen Dateityp anhand seines Inhalts (und nicht seiner zugewiesenen Erweiterung) zu bestimmen? Sie müssen auch die Zeit messen, die benötigt wird, um das Bild in GD zu laden, da ich keine andere Verarbeitung als das Bestimmen der Dateigröße mache. – Gilles

+0

Ich habe den Test zu meiner Antwort hinzugefügt. Ich weiß nicht, ob GD die Bilddatei vollständig in den Speicher lädt oder nicht, da ich keine Speicherkapazität habe. Aber ich erhalte die komplette Zeit, die für die Ausführung des Befehls benötigt wird. Auch getimagesize() gibt den Mime-Typ zurück. –

+0

Danke für all die Bemühungen, ich habe es live getestet und es ist in der Tat 250 mal schneller als die -Ping-Lösung. Also ungefähr 5000 mal schneller als die ursprüngliche Methode, die ich benutzte, nicht schlecht :) – Gilles

7

Wenn Sie mit PHP mit GD-Unterstützung, ImageMagick von PHP, ähnlich wie die Art und Weise genannt ein Kommandozeilen-Tool UNIX sein bin verwenden, können Sie versuchen Sie getimagesize().

+0

GD wird wahrscheinlich von der gleichen Geschwindigkeitsproblem leiden, da es das Bild in den Speicher geladen wird ... – Gilles

+0

True. Ich weiß nicht anders als es selbst zu schreiben und nur einen Teil des Bildes im Speicher zu speichern, aber das hängt vom Bildtyp ab. –

2

Es ist mir wichtig, dass der Dateityp durch Blick auf die Header der Datei und nicht nur die Erweiterung bestimmt wird.

Dafür können Sie 'Datei' Unix-Befehl (Orsome PHP-Funktion, die die gleiche Funktionalität implementiert) verwenden.

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

+0

Ich habe es gerade in der Kommandozeile getestet und es scheint auch ziemlich langsam, dauerte eine gute Sekunde, um den Dateityp des JPG zu bestimmen. Es scheint das Ergebnis zu cachen, aber das interessiert mich nicht, da ich das Bild nur einmal testen werde. – Gilles

+0

Teil davon ist wahrscheinlich die Zeit, die es dauert, die magische Datei zu analysieren. Sie können die Datei auf einer ganzen Reihe von Bildern gleichzeitig ausführen. Oder Sie könnten eine kleinere magische Datei mit den gebräuchlichen Bilddateitypen erstellen. – palm3D

4

Haben Sie

versucht
identify -ping filename.png 

?

+0

Guter Anruf, es ist etwa 20 mal schneller :) Die Beschreibung dieser Option lässt mich fragen, warum es nicht das Standardverhalten von identifizieren ist? Wie auch immer, Problem gelöst und vielen Dank. – Gilles

2

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

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

1

exif_imagetype() schneller als getimagesize().

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

Ausgang:

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

0

Wenn Sie PHP verwenden würde ich vorschlagen, die Imagick Bibliothek statt exec() aufrufen. Die gesuchte Funktion ist Imagick::pingImage().