Magic number funktion
Magic number funktion
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
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:
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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.
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.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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
Aber wenn es nur ums laden von Grafiken geht - entweder QImageReader lädt es oder eben nicht
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
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.
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.
@Christian81: Kann sein, aber mein System hier ist schon etwas älter
@ZSchneidi: Du sucht aber nicht das hier:
Ach ja, laden muß man immer, die Frage ist halt wieviel.
@ZSchneidi: Du sucht aber nicht das hier:
Code: Alles auswählen
QByteArray QImageReader::imageFormat(const QString &fileName)
@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.
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.
Dann hast du das nicht mal ansatzweise versucht, denn diese Funktion sollte genau das machen was du suchst: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.
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')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 ...
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 ...
@ 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.
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.
Ü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).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.
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
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 ...
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
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