Bilddateiformat ohne Dateiendung ermitteln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich möchte ein Bild, das keine Dateiendung hat, in einen anderen Ordner verschieben und dabei das Bild umbenennen, sodass es die richtige Dateiendung hat.
Eigentlich ein simples Problem, aber ich habe nur eine unschöne Lösung gefunden, indem ich das Bildformat mithilfe des Image Moduls ermittle.

Code: Alles auswählen

import os.path
import shuttil
import Image
src = '~/Bild' #Bild ohne Dateiendung
im = Image.open(src)
des = os.path.join('~/Desktop', ('Bild' + '.' + im.format.lower()))
shuttil.move(src, des)
Hat jemand von euch noch eine bessere Idee?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

python-magic kann sowas:

Code: Alles auswählen

>>> import magic
>>> ms = magic.open(magic.MAGIC_NONE)
>>> ms.load()
0
>>> ms.file("/tmp/bla")
'PNG image data, 100 x 100, 8-bit/color RGBA, non-interlaced'
Da muss man jedenfalls nicht das ganze Bild laden. Ob man sich jetzt die Endung aus dem String parsen muss oder ob magic noch netteres hat, weiss ich auch nicht.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
problembär

Man könnte den Linux-"file"-Befehl aufrufen. Auch nicht sehr schön.

Für Perl gibt's ein entsprechendes Modul; vielleicht gibt's ja so eins auch für Python?
lunar

python-magic nutzt wohl libmagic, und diese Bibliothek gibt die Information über die Datei nur in Textform zurück.

Als Alternative kann aber vielleicht [mod]imghdr[/mod] aus der Standardbibliothek dienen. Keine Ahnung, ob das was taugt …
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Vermutlich (oder auch nicht) handelt es sich bei den in Frage kommenden Dateien nur um eine handvoll verschiedener Formate. Da dürfte es ggf. schon ausreichen, jeweils nur das 1. Byte zu lesen und auszuwerten:
255 -> jpg
71 -> gif
137 -> png
Je nachdem welches GIF, PNG oder JPG-Format du genau hast, kann es sein, dass das nicht für alle Untertypen gilt, aber das ist ja nicht schwer herauszufinden.

Edit: Erst jetzt habe ich mir den Link von lunar angesehen. Damit hast du doch genau, was du wolltest.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Vielen Dank für eure Antworten. Das Modul imghdr löst das Problem sehr elegant. :)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

libmagic kann zumindest den Mimetype ausgeben:

Code: Alles auswählen

>>> m=magic.open(magic.MAGIC_MIME)
>>> m.load()
0
>>> m.file('install_list')
'text/plain charset=us-ascii'
>>> m.file('bild.jpg')
'image/jpeg'
Den Mimetype kann man dann relativ einfach auf die Dateiendung mappen.
Antworten