Ich suche nach einem schnellen Weg, um die Höhe und Breite eines Bildes in Pixel zu ermitteln. Es sollte mindestens JPG, PNG und TIFF verarbeiten, aber je mehr desto besser. Ich betone schnell, weil meine Bilder ziemlich groß sind (bis zu 250 MB) und es soooo lange dauert, bis die Größe mit ImageMagick erreicht ist, identify
da die Bilder offensichtlich zuerst als Ganzes gelesen werden.
Am besten suche ich nach einem Weg, der in Ruby oder sogar in Rails 3 gut funktioniert.
Ich kenne die Theorie (verschiedene Bildformate, ihre Überschriften und ihre Unterschiede usw.). In der Tat bitte ich um eine Art Bibliothek, die mein Problem auf ziemlich allgemeine Weise lösen kann.
Ich habe gerade eine Bildgröße gefunden, die vielversprechend aussieht, obwohl die Entwicklung tot zu sein scheint.
Antworten:
Der
file
Befehl druckt die Abmessungen für verschiedene Bildformate (z. B. PNG, GIF, JPEG; neuere Versionen auch PPM, WEBP) und liest nur den Header.Der
identify
Befehl (von ImageMagick) druckt viele Bildinformationen für eine Vielzahl von Bildern. Es scheint sich darauf zu beschränken, den Header-Teil zu lesen (siehe Kommentare). Es hat auch eine einheitliche Ausgabe, diefile
leider fehlt.exiv2
bietet Ihnen Dimensionen für viele Formate, einschließlich JPEG, TIFF, PNG, GIF, WEBP, auch wenn kein EXIF-Header vorhanden ist. Es ist jedoch unklar, ob die gesamten Daten dafür gelesen werden. In der Manpage von exiv2 finden Sie alle unterstützten Bildformate.head -n1
gibt Ihnen die Abmessungen für PPM- und PGM-Formate an.Für Formate, die im Web beliebt sind, werden beide
exiv2
undidentify
die Arbeit erledigen. Je nach Anwendungsfall müssen Sie möglicherweise ein eigenes Skript schreiben, das die Ausgaben mehrerer Tools kombiniert / analysiert.quelle
Ich bin nicht sicher, ob Sie PHP installiert haben, aber diese PHP-Funktion ist ziemlich praktisch
quelle
Sie können die Identifizierungsfunktion von ImageMagick verwenden. So geht's in Bash (Hinweis: $ 0 ist der Pfad des Bildes):
Und dies verbirgt auch mögliche Fehlermeldungen. Moderne Implementierungen
identify
lesen nur den Header, nicht das gesamte Image, also ist es schnell. Ich bin mir nicht sicher, wie es mit anderen Methoden verglichen wird.quelle
read width height < <(identify -format "%w %h" "${1}")
https://joseluisbz.wordpress.com/2013/08/06/obtaining-size-or-dimension-of-images/ (BMP, PNG, GIF, JPG, TIF oder WMF)
Hier für zwei Formate PNG und JPG.
Mein Code stammt aus einer Klasse, die für meine Verwendung entwickelt wurde. Sie können ihn gemäß Ihren Anforderungen bearbeiten.
Bitte überprüfen Sie diese Funktionen / Methoden mit PHP :
Verwenden des PHP-Codes:
Nun diese Funktionen / Methode mit JAVA :
Verwenden des Java-Codes:
quelle
ref
/out
Parameter in Java abzurufen - wird dies als Best Practice angesehen?Es sind die Pixelabmessungen, die Sie wollen (Breite und Höhe), nehme ich an?
Ich würde denken, dass die meisten Dateiformate einige Header-Informationen enthalten, die die Abmessungen definieren, sodass die Software, die die Datei liest, wissen kann, wie viel Platz sie reservieren muss, bevor sie mit dem Lesen der Datei beginnt. Einige Dateiformate vom Typ "roh" sind möglicherweise nur ein Bytestrom mit einem Byte am Zeilenende am Ende jeder horizontalen Pixelreihe (in diesem Fall muss die Software die erste Zeile lesen und die Größe des Bytestreams teilen durch die Linienlänge, um die Höhe zu erhalten).
Ich glaube nicht, dass Sie dies auf "generische" Weise tun können, da Sie das Dateiformat verstehen müssen (oder natürlich eine Bibliothek verwenden müssen), um zu wissen, wie man es liest. Sie können wahrscheinlich einen Code finden, der in den meisten Fällen eine grobe Schätzung der Abmessungen liefert, ohne die gesamte Datei zu lesen, aber ich denke, bei einigen Dateitypen müssen Sie möglicherweise die gesamte Datei lesen, um sicherzugehen, welche Abmessungen sie tatsächlich hat. Ich gehe davon aus, dass die meisten webzentrierten Bildformate einen Header mit solchen Informationen haben, damit der Browser die Boxabmessungen erstellen kann, bevor das gesamte Bild geladen wird.
Ich würde vermuten, dass eine gute Bibliothek einige Methoden hat, um die Abmessungen der Dateien zu ermitteln, die sie verarbeitet, und dass diese Methoden so effizient wie möglich implementiert werden.
Update : imageinfo scheint zu tun, was Sie wollen. (Habe es nicht getestet)
quelle
Wenn die Bilder EXIF-Informationen enthalten, können Sie einfach den EXIF-Header lesen.
quelle
-ping ist eine Option, die anscheinend zu diesem Zweck eingeführt wurde.
Ab ImageMagick 6.7.7 beobachte ich jedoch nicht einmal bei allen großen Dateien eine Verlangsamung, z.
Können Sie ein Beispiel für ein Eingabebild erstellen, für das es noch langsam ist?
quelle
tldr: Datei "Bildname" reicht aus
funktioniert mit webp, allen jpg-Formaten (jpeg, jpg200, ..),
Die Beispielausgabe sieht so aus
Laden Sie die Ausgabe der Datei in eine Python-Liste und verwenden Sie das 4. Feld in der Liste.
Zu Ihrer Information, hat mehr als 18000 Bilder optimiert, um den Netzwerkverkehr zu reduzieren.
quelle