Magic number funktion

Alles rund um die Programmierung mit Qt
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Magic number funktion

Beitrag von ZSchneidi »

Hey, ich bräuchte die möglichkeit Bilddateien auf ihr format zu untersuchen.

Das will ich anhand der magic number machen.
Gibt es dafür bereits functionen in Qt oder muss ich mir das selbst schreiben?
Vielleicht gibt es ja auch schon anderweitige bibliotheken, die mir sowas bieten. Wollte mir den Part nur evtl. sparen, wenn möglich.

Vielleicht kennt ja wer ne gute Lösung dazu.

Danke
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sowas gibts nicht. Prinzipielle mime-type detection gibts in kdelibs (KMimeType & friends)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Das ist eigentlich recht schade, zumal das doch zu den essentiellen operationen im umgang mit daten ist oder sehe ich das falsch ?

Ich mein, das will doch wissen, mit was für einem Dateiformat man es genau zu tun hat, oder kommt sowas zu selten vor ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Naja - kommt drauf an. Meistens reicht die Endung - vor allem bei Bildern.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Genau, ist natürlich im ersten moment Sinn der sache mit den Suffixen,
problematisch wird es dann, wenn man keinen suffix anhängt, oder einen falschen dran hängt.

Beispiel:

bla.jpg
bla.png
bla.foo
bla

Ein und die selbe datei nur nicht richtig gepflegt, hier fällt es bis auf die erste version schwer auf anhieb rauszufinden worum es sich wirklich handelt. Da wäre es eher unsauber sich nur auf die Endung zu verlassen. Auf meinen Linux systemen hab ich auch oft den Fall gehabt, dass der suffix komplett fehlt. deshalb will ich das format direkt anhand der magic number rausfinden. Halte ich persönlich für die sauberste methode.

Falls doch noch jemand ne idee, hat wo ich dafür ne lib finde, wäre ich dankbar, weil das doch ne menge aufwand bedeutet.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn man sich magic.mime (Die Vorlage für file unter Linux) so ansieht, merkt man daß Grafikformate anhand der ersten paar Byte erkannt werden. Also entweder mal diese Datei ansehen oder mal mit einem Hex-Editor auf ein paar Grafiken losgehen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

magic.mime? Ich würde sagen shared-mime-info ist da die aktuelle Variante.
Aber wenn es nur ums laden von Grafiken geht - entweder QImageReader lädt es oder eben nicht :D
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

heh klar ok, nur will ich im vorfeld ja selektieren, was überhaupt versucht werden soll zu laden.

Zum einen hab ich ne blacklist implementiert, die gewisse formate ausschließen soll, zum anderen, will ich nicht erst beim laden nen fehler abfangen müssen, von wegen kann nicht geladen werden.

@upsala

Das bezieht sich ja alles auf das thema Magic Numbers, das sind immer die ersten Bytes zur identifizierung eines formates, das bezieht sich nicht nur auf Bildformate.

Hab mir testweise schon mal ein paar Formate im hex editor angesehen, da stehts drin wie erwartet, hab selbst auch schon erfolgreich nen paar tests gefarhen.

Ist auch alles keine Zauberei ... hmmm Zauberei ... ^^
Nur eben ein ziemlicher Aufwand, das für jedes erdenkliche format durchzuführen. Sowas würde sich eigentlich ganz gut machen für den ImageReader oder dergleichen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

@Christian81: Kann sein, aber mein System hier ist schon etwas älter

@ZSchneidi: Du sucht aber nicht das hier:

Code: Alles auswählen

QByteArray QImageReader::imageFormat(const QString &fileName)  
Ach ja, laden muß man immer, die Frage ist halt wieviel.
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

@upsala

Nein leider gibt QImageReader::imageFormat() nicht die art von Format zurück, die ich erwarten würde.

Das format auf das sich die funktion bezieht beschreibt bereits die Farbräume oder Farbkodierung. Das ist bereits eine Nummer zu genau.

Ich bräuchte schon eine selektierung auf Anwendungsebene.

Recht hast natürlich, dass ich schon mal anfangen muss zu laden, nur weiß ich dann schon nach den erste 4 bytes, ob ich ein bild wirklich vollständig lade oder auslasse.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

ZSchneidi hat geschrieben:Nein leider gibt QImageReader::imageFormat() nicht die art von Format zurück, die ich erwarten würde.

Das format auf das sich die funktion bezieht beschreibt bereits die Farbräume oder Farbkodierung. Das ist bereits eine Nummer zu genau.
Dann hast du das nicht mal ansatzweise versucht, denn diese Funktion sollte genau das machen was du suchst:

Code: Alles auswählen

>>> QImageReader.imageFormat("/tmp/test.png")
PyQt4.QtCore.QByteArray('')
>>> QImageReader.imageFormat("/tmp/test")
PyQt4.QtCore.QByteArray('jpeg')
>>> QImageReader.imageFormat("/tmp/test.foo")
PyQt4.QtCore.QByteArray('jpeg')
Nur wenn ein jpeg als .png gespeichert ist macht das Probleme.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

warum suchste nicht alle korrekten Dateien, machst ne stringlist aus dem was QFileInfo::baseName() liefert und testöffnest alle Dateien die einem Filter auf diese Namen entsprechen. Insgesamt finde ich deinen Wunsch aber seltsam ... lieber 2000+ Dateien testweise zu öffnen und 4 Byte auszulesen statt sich auf die "kostenlose" Dateiendung zu verlassen ... ich würde da besser dem inkonsistent Speichernden in den Allerwertesten beissen. Und mal abgesehen davon ... die API hilft:

http://doc.qt.nokia.com/4.6/qimagereade ... quote]Sets the file name of QImageReader to fileName. Internally, QImageReader will create a QFile object and open it in QIODevice::ReadOnly mode, and use this when reading images.

If fileName does not include a file extension (e.g., .png or .bmp), QImageReader will cycle through all supported extensions until it finds a matching file.


See also fileName(), setDevice(), and supportedImageFormats().[/quote]

Also : bei vermuteter Grafik: Endung abschneiden, QImageReader füttern, http://doc.qt.nokia.com/4.6/qimagereader.html#read nutzen und schaun obs ein nicht-null QImage bei rumkommt oder http://doc.qt.nokia.com/4.6/qimagereader.html#format und schaun welches er nahm ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

@ franzf

Ok ich gebe dir recht, mein erster test schlug fehl, da bekam ich ne 0 zurück.
Hab es nochmal über die static gemacht und es funktionierte tatsächlich ganz gut, auch ähnlich wie gewünscht.

Aber leider nicht ganz so zuverlässig, wie du schon vorweggenommen hast.
Seltsammerweise, kommt er mit fehlenden suffixen klar, aber mit falschen nicht.


@padreigh

An sich gebe ich dir recht, dass der nutzer schon darauf achten sollte, das seine Dateien ordentlich in stand gehalten werden. Allerdings sollte man auch an nutzer denken, die vielleicht nicht die Ahnung haben.

Bei 2000 dateien wird die sache natürlich etwas anders, da sollte man vielleicht wirklich davon absehen.

Die definition is auch noch nicht komplett und momentan etwas schwammig. Ich gehe derzeit den weg, dass ich beim laden eines bildes den ganzen ordner druchsuche und anhand der dateiformate entscheide, was geladen wird. Für den fall, dass zum beispiel keine Endung vorhanden ist, will ich den dem user nen prompt vorsetzen, von wegen "soll ichs fixen ?".
Dazu müsste ich schon zuverlässig wissen, was für ein format vorliegt.

Möglicherweise reicht QImageReader::imageFormat() ja schon aus, da es zumindest den groben anteil richtig bestimmt.
Schade nur, dass die methode nicht so ganz sauber arbeitet.

Und die frage die sich hier stellt, welche formate werden überhaupt richtig erkannt ? Wenn einer mit nem exoten daher kommt, wäre wohl kaum anzunehmen, dass ich ein richtiges format bekomme.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Und die frage die sich hier stellt, welche formate werden überhaupt richtig erkannt ? Wenn einer mit nem exoten daher kommt, wäre wohl kaum anzunehmen, dass ich ein richtiges format bekomme.
Überleg doch mal ... wenn es eine Funktion gaebe, wie Du sie willst, Dann brauechtest du ein Ding / eine Lib oder eine Dll, die alle Formate namentlich kennt inklusive wie man die binaer erkennt (es sind nicht immer nur ausschliesslich die ersten 4 Bytes).

Wer pflegt denn sowas ?

Und damit waere auch das QT PluginKonzept im Arsch ...
Gabe es ne neues Bildformat, und du kopierst das Plugin in dein verzeichniss, wuerde QT es trotzdem ned erkennen, weil deine BildFormaterkennungslib es ned kennt.

Also ums Proben (dass entsprechende Plugin auf die datei loslassen) wirst ned umhinkommen ....

weiterhin ist die Formatunterscheidung bei den unterschiedlichen system doch teilweisse eh anders geloest ....
Die Dateiendung kam doch erst mit Linux und der Globalisierung (Internet) mit Windows in die Unix Welt. Glaub vorher hatten die Dateien erweiterte FileAttribute, wo auch der mime-typ drinnstehen konnte ...
Gab doch systeme wo Die Datei "Sonnenaufgang" (ohne Endung) hies und das BS es trotzdem korrekt als Bild erkannte.

Denk wenn man Woellte koennt man da viel mehr machen ... Problem ist das man durch das Inet heutzutage einen globalen Plattformuebergreifenden Standard braeuchte ... Ne Magic Number oder nen String im Dateiattribut ist heutzutage bei keinem FileSystem ein Problem ... warum brauchen wir wohl noch diese dämlichen Endungen und die Kontrollbytes im Datenstrom ??? (Danke Fat16 !).

Ciao ...
ZSchneidi
Beiträge: 65
Registriert: 16. Juli 2009 13:30

Beitrag von ZSchneidi »

Da geb ich dir schon recht.

Mir selbst ist der Gedanke schon gekommen, das eine vollständige Prüfung so ziemlich unwartbar währe.

Ich hab das bereits bei den ersten formaten gemerkt, dass es teils bei gleichen formaten noch unterschiede gibt.

Ich werd mir also was anderes einfallen lassen.
Besonders mit hinblick auf größere datenmengen, sollte das möglichst fix gehen.

Falls jemand noch ne gute idee dazu hat wie ich ungewollte formate aussortieren kann, ohne das erst über die plugins prüfen zu lassen, immer raus damit.

Danke
Antworten