Ich versuche, eine wirklich schnelle Methode zu finden, um die Abmessungen eines Bildes zu bestimmen.
Ich weiß, dass ich das Bild betrachten und dann mit imagemagick die Höhe und Breite des Bildes bestimmen kann. Ich mache mir Sorgen, dass dies möglicherweise nicht der schnellste Weg ist.
Ich mache mir auch Sorgen, dass ich imagemagick installieren muss, wenn ich nur eine sehr kleine Teilmenge der Funktionalität benötige. Ich bin auf einem eingebetteten System mit sehr begrenzten Ressourcen (CPU, RAM, Speicher).
Irgendwelche Ideen?
bash
wget
imagemagick
Exvance
quelle
quelle
Antworten:
Wie Sie bemerken, benötigen Sie nicht das gesamte ImageMagick- Paket. Du brauchst nur
identify
.Sie benötigen auch die Bibliotheken, auf die die ausführbaren Links verweisen (und die Bibliotheken, auf die diese Bibliotheken verweisen).
ldd
wird eine Liste anzeigen. Als ich dies tat, enthielt es einige X-Bibliotheken, libjpeg usw. und zwei Bibliotheken, die eindeutig aus dem ImageMagick-Paket stammen,libMagickCore
undlibMagickWand
. Diese scheinen mit den gleichen Dingen verbunden zu sein. Wenn Sie das haben,identify
sollten sie funktionieren.Sie müssen nicht ein ganzes Bild herunterladen, um die Abmessungen zu erhalten, da sich diese in einer Kopfzeile am Anfang der Datei befinden und genau das wird
identify
angezeigt. Zum Beispiel kopiere ich hier die ersten 4 kB von einem vollständigen JPEG in eine neue Datei:4 kB sollten mehr als genug sein, um den Header aufzunehmen - ich bin sicher, Sie könnten es mit 1/4 dieser Menge tun. Jetzt:
Das sind die richtigen Maße für
real.jpg
. Beachten Sie jedoch, dass die Größe (4,1 KB) der Größe der abgeschnittenen Datei entspricht, da diese Informationen nicht aus dem Bildheader stammen.Also: Sie müssen nur das erste Kilobyte oder so von jedem Bild herunterladen.
quelle
Sie können
curl
damit Teile des Bildes herunterladen. Es hängt alles davon ab, wie robust es sein muss. Ein Testfall könnte aus den ersten 500 Bytes bestehen. Scheint für eine Menge von zu arbeitenpng
undjpg
dannidentify
oder ähnliches zu verwenden, um die Größe zu überprüfen.Bearbeiten:
Es ist lange her, dass ich Bildparser geschrieben habe, aber ich habe darüber nachgedacht und einen Teil meines Gedächtnisses aufgefrischt.
Ich vermute, dass es alle Arten von Bildern sind, die Sie überprüfen möchten (aber andererseits vielleicht auch nicht). Ich werde einige der gebräuchlichsten beschreiben :
PNG
,JPEG
(JFIF) undGIF
.PNG:
Diese sind einfach, wenn es um die Extraktion von Größe geht. Ein
png
Header speichert die Größe innerhalb der ersten 24 Bytes. Zuerst kommt ein fester Header:Als nächstes kommen Brocken durch die Akte. Sie bestehen aus einem festen Feld von Länge, Typ und Prüfsumme. Zusätzlich ein optionaler Datenabschnitt mit Längengröße .
Zum Glück ist der erste Block immer ein
IHDR
mit diesem Layout:Damit haben wir, dass die Größen Byte 16-20 und 21-24 sind. Sie können die Daten durch zB hexdump sichern:
Auf einem Big Endian / Motorola-Computer können die Größen auch direkt gedruckt werden durch:
Bei Little Endian / Intel ist dies jedoch nicht so einfach und auch nicht sehr portabel.
Auf diese Weise könnten wir ein bash + hexdump-Skript wie folgt implementieren:
Dies ist jedoch nicht direkt effizient. Obwohl es einen größeren Block (75-100 Bytes) erfordert,
identify
ist es eher schneller. Oder schreiben Sie die Routine in z. B. C, was schneller wäre als Bibliotheksaufrufe.JPEG:
Wenn es darum
jpg
geht, ist es nicht so einfach. Es beginnt auch mit einem Signatur-Header , aber der Größenblock hat keinen festen Versatz. Nach dem Header:Ein neuer Block wird durch eine Zwei-Byte-Markierung angegeben, die mit beginnt
0xff
. Derjenige, der Informationen über Dimensionen enthält, hat den Wert0xffc0
, kann aber ziemlich viel in den Daten vergraben sein.Mit anderen Worten, man überspringt Bytes in Blockgröße , prüft die Markierung, überspringt Bytes in Blockgröße , liest die Markierung usw., bis die richtige kommt.
Wenn gefunden, werden die Größen um jeweils zwei Bytes am Versatz 3 und 5 nach der Markierung gespeichert .
Schrieb ein einfaches C-Programm, um einige Dateien und etwa 10.000 JPG-Bilder zu überprüfen. Ungefähr 50% hatten die Größeninformationen innerhalb der ersten 500 Bytes, meistens 50% zwischen ca. 100 und 200. Das Schlimmste war rund 80.000 Bytes. Ein Bild, während wir Bilder sprechen:
GIF:
Obwohl in gif normalerweise mehrere Bilder gespeichert werden können, hat es eine in der Kopfzeile angegebene Leinwandgröße , die groß genug ist, um die Bilder aufzunehmen. Es ist so einfach wie mit PNG und erfordert sogar Fieberbytes: 10. Nach Magie und Version finden wir Größen. Beispiel aus einem 364x472-Bild:
Mit anderen Worten, Sie können die ersten sechs Bytes überprüfen, um festzustellen, ob es sich um ein GIF handelt, und dann die nächsten vier für Größen lesen.
Andere Formate:
Hätte weitergehen können, aber ich schätze, ich höre hier vorerst auf.
quelle
Angenommen, Sie haben "identifizieren". Setzen Sie dies in ein Skript und
chmod +x <scriptname>
. Um es auszuführen, geben Sie ein<scriptname> picture.jpg
und Sie erhalten die Höhe und Breite des Bildes. In den ersten beiden Abschnitten wird geprüft, ob ein Bild vorhanden ist, und dann als IMAGE-Variable festgelegt. Der nächste Abschnitt soll sicherstellen, dass die Datei tatsächlich vorhanden ist. In den letzten beiden Abschnitten werden die relevanten Informationen aus der Ausgabe "Identifizieren" entnommen und angezeigt.quelle
file command
wird standardmäßig auf Distoren installiert und hängt nur ab von:Ich denke, Sie können es einfach für Embedded installieren. Sie schreiben einfach ein
regular expression
für seine Ausgabe.quelle
file
gibt keine Dimensionen für z.jpg
. B. Dateien an.Sie ersetzen
file://
durchhttp://
quelle