Ich verstehe, dass Sie die Bildgröße mit PIL auf folgende Weise erhalten können
from PIL import Image
im = Image.open(image_filename)
width, height = im.size
Ich möchte jedoch die Bildbreite und -höhe erhalten, ohne das Bild in den Speicher laden zu müssen. Ist das möglich? Ich mache nur Statistiken über Bildgrößen und kümmere mich nicht um den Bildinhalt. Ich möchte nur meine Verarbeitung beschleunigen.
python
image
image-processing
Sami A. Haija
quelle
quelle
.open()
die gesamte Datei in den Speicher eingelesen wird ... (das ist was.load()
) - soweit ich weiß - das ist so gut wie es nur gehtPIL
pmap
zur Überwachung des von einem Prozess verwendeten Speichers zeigt mir, dass tatsächlichPIL
nicht das gesamte Bild in den Speicher geladen wird.Antworten:
Wie in den Kommentaren erwähnt, lädt PIL das Bild beim Aufruf nicht in den Speicher
.open
. Wenn Sie sich die Dokumente vonPIL 1.1.7
ansehen,.open
sagt der Dokumentstring für :Es gibt einige Dateioperationen in der Quelle wie:
aber diese bilden kaum das Lesen der gesamten Datei. Tatsächlich wird
.open
bei Erfolg einfach ein Dateiobjekt und der Dateiname zurückgegeben. Zusätzlich sagen die Dokumente :Wenn wir tiefer graben, sehen wir, dass
.open
Anrufe_open
eine bildformatspezifische Überlastung darstellen. Jede der zu implementierenden Implementierungen_open
befindet sich in einer neuen Datei, z. JPEG-Dateien befinden sich inJpegImagePlugin.py
. Schauen wir uns das genauer an.Hier scheinen die Dinge etwas knifflig zu werden. Darin befindet sich eine Endlosschleife, aus der herausgebrochen wird, wenn der JPEG-Marker gefunden wird:
Das sieht so aus, als könnte es die gesamte Datei lesen, wenn sie fehlerhaft wäre. Wenn der Info-Marker jedoch OK lautet, sollte er früh ausbrechen. Die Funktion
handler
legt letztendlich fest,self.size
welche Abmessungen das Bild hat.quelle
open
bekommt die Größe des Bildes oder ist das auch eine faule Operation? Und wenn es faul ist, liest es gleichzeitig die Bilddaten?Docs/PIL.Image.html
..jpeg
Format sieht in Ordnung aus, solange der Header gefunden wird.Wenn Sie sich nicht für den Bildinhalt interessieren, ist PIL wahrscheinlich ein Overkill.
Ich schlage vor, die Ausgabe des Python Magic-Moduls zu analysieren:
Dies ist ein Wrapper um libmagic, der so wenig Bytes wie möglich liest, um eine Dateitypsignatur zu identifizieren.
Relevante Version des Skripts:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[aktualisieren]
Scheint, als wären JPEGs magieresistent. :-)
Ich kann verstehen, warum: Um die Bildabmessungen für JPEG-Dateien zu erhalten, müssen Sie möglicherweise mehr Bytes lesen, als libmagic gerne liest.
Ich krempelte die Ärmel hoch und kam mit diesem sehr ungetesteten Snippet (von GitHub) , das keine Module von Drittanbietern erfordert.
[Update 2019]
Schauen Sie sich eine Rust-Implementierung an: https://github.com/scardine/imsz
quelle
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
auf MacOS, Python3 aufdata = input.read(25)
,file
auf Bild gibtPNG image data, 720 x 857, 8-bit/color RGB, non-interlaced
Es gibt ein Paket auf pypi namens
imagesize
, das derzeit für mich funktioniert, obwohl es nicht so aussieht, als wäre es sehr aktiv.Installieren:
Verwendung:
Startseite: https://github.com/shibukawa/imagesize_py
PyPi: https://pypi.org/project/imagesize/
quelle
Ich rufe oft Bildgrößen im Internet ab. Natürlich können Sie das Bild nicht herunterladen und dann laden, um die Informationen zu analysieren. Es ist zu zeitaufwändig. Meine Methode besteht darin, einem Bildcontainer Chunks zuzuführen und zu testen, ob das Bild jedes Mal analysiert werden kann. Stoppen Sie die Schleife, wenn ich die gewünschten Informationen erhalte.
Ich habe den Kern meines Codes extrahiert und geändert, um lokale Dateien zu analysieren.
Ausgabe:
Die tatsächliche Dateigröße beträgt 1.543.580 Byte, und Sie lesen nur 38.912 Byte, um die Bildgröße zu erhalten. Hoffe das wird helfen.
quelle
Eine weitere kurze Möglichkeit, dies auf Unix-Systemen zu tun. Es hängt von der Ausgabe ab, von
file
der ich nicht sicher bin, ob sie auf allen Systemen standardisiert ist. Dies sollte wahrscheinlich nicht im Produktionscode verwendet werden. Darüber hinaus geben die meisten JPEGs die Bildgröße nicht an.quelle
IndexError: list index out of range
Diese Antwort hat eine andere gute Auflösung, aber das pgm- Format fehlt . Diese Antwort hat das pgm gelöst . Und ich füge den bmp hinzu .
Codes ist unten
quelle
imghdr
handhabt jedoch bestimmte JPEGs ziemlich schlecht.