PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Bilddaten einlesen


Gast
2009-11-04, 16:16:39
Hallo zusammen !

Ich hab ein kleines Problem, bei dem ich mal ein paar Tips gebrauchen könnte:

Ich spiel momentan mit Smartcards rum und hab einige Daten (Text) erfolgreich auf Karte schreiben und auch wieder auslesen können. Nun würde ich aber gerne ne Bilddatei einlesen, und weiß nicht so recht, wie ich das anstellen soll.
Ich probiere mich dabei mit Visual Studio 2005 und dem Codegear (ex Borland) C++ Builder 2007.
Die Bilddatei ist folgendermaßen auf der Karte gespeichert (nur ein Ausschnitt):

http://www.abload.de/img/picdatanqfo.jpg (http://www.abload.de/image.php?img=picdatanqfo.jpg)

Wie krieg ich das Ungetüm wieder als Bild von der Karte runter ? :)

Danke schonmal für alle hilfreichen Antworten und Denkanstöße !

Gast
2009-11-04, 16:19:05
Falls es weiterhilft: bevor das Bild auf die Karte gespielt wurde, hab ich es ins jpeg2000-Format konvertiert.

Coda
2009-11-04, 17:55:15
Wie wär's mit einem JPEG2000-Decoder? Aber irgendwie kommt's mir so vor als willst du uns eh nur verarschen.

Gast
2009-11-04, 18:00:21
Äh nein, was lässt darauf schließen ?

Pinoccio
2009-11-04, 18:03:00
Äh nein, was lässt darauf schließen ?Kein Mensch nutzt jpeg2000! :D

Wie schriebst bzw. liest du denn den Text?

mfg

Gast
2009-11-04, 18:16:34
Also:

Ich mache ein Praktikum und arbeite mit bereits vorhandener Software, die ich nun noch etwas ausbauen darf. JPEG2000 oder WSQ sind laut der entsprechenden ISO-Norm Voraussetzung. Die Daten werden als Byte-Array eingelesen und dann mit einer vorhandenen Methode auf die Karte geschrieben.

Eine Nummer (1867) wird eingelesen und sieht dann auf der Karte z.B. so aus:

0x31 0x38 0x36 0x37

Texte und Nummern klappen ja soweit, nur weiß ich eben nicht, wie ich nun das Bild wieder auslesen könnte.

Coda
2009-11-04, 21:21:14
Also das was gespeichert wird ist der reine Inhalt einer JPEG2000-Datei, d.h. das was wir da sehen ist JPEG2000?

Wenn du nicht weißt was du da überhaupt ausliest können wir dir auch schlecht helfen. Das gibt meine Glaskugel nicht her.

samm
2009-11-04, 21:45:45
Du hast die Schreibmethode vorgegeben, aber nicht die Lesemethode? Irgendwas muss ja eingelesen werden, bevor das Bild gespeichert werden kann...

Pinoccio
2009-11-05, 10:00:51
Es gibt fertige und offene JPEG2000-Bibliotheken (http://www.ece.uvic.ca/~mdadams/jasper/), vieleicht helfen dir diese weiter. Wenn du über ein Dateisystem einliest bzw. schreibst, solltest du damit alles machen können.
eGK?

mfg

Gast
2009-11-05, 12:28:38
So, da bin ich mal wieder...

Also, ich hab mich jetzt zumindest mal von JPEG2000 verabschiedet, da JPEG anscheinend auch erlaubt ist.
Ansich ändert sich jetzt dadurch aber nicht viel, oder ?
Das Originalbild liegt als Bitmap vor, wird anschließend zunächst ins JPEG-Format umgewandelt, dann auf die Karte geschrieben und liegt schlußendlich wie in dem Bildausschnitt im Startpost erkennbar auf der Karte vor, also in Rohdaten ?

Gast
2009-11-05, 12:29:47
Danke für den Hinweis mit der Jasper-Lib, das schau ich mir mal genauer an.

Pinoccio
2009-11-05, 13:26:55
also in Rohdaten ?Eine JPEG-Datei besteht - wie praktisch alle Bildformate - aus zwei Teilen: einem Header (http://www.obrador.com/essentialjpeg/headerinfo.htm), der dir verrät, wieviele Pixel das Bild hat, welche Quantisierungstabellen benutzt werden, welches Farbformat etc. Und den Daten, die das eigentliche Bild enthalten.
Je nach Anwendung und Vorgabe kann der Header mit auf der Karte stehen, bei praktisch allen Consumer-Anwendungen ist das der Fall. Muß man aber neispielsweise im Embedded-Bereich auf Speicherplatz opimieren und ist der Header (bis auf die Information, wie lang die Datei ist) identisch, könnte man ihn auch weglassen und in die Karten-Auslese-Logik packen. Das ganze wäre dann aber wohl nur noch im Prinzip standardkonform.
(Ohne Header könnte man das Orginalbild nur schwer wiederherstellen. Wäre als Sicherheistmerkmal Security-by-obscurity (http://de.wikipedia.org/wiki/Security_through_obscurity) möglicherweise gegenüber BWLern ein Verkaufargument für Karten, auf denen man Passsbilder und Fingerabdrücke speichern will.)

Was jetzt die Rohdaten sind, die auf der Karte stehen, das weiß hier außer dir keiner.
Du könntest natürlich den kompletten Inhalt posten und wir schauen uns das mal an ... ;D

/edit: Korrekterweise müsste man hier noch klar trennen zwischen JPEG, dem Bildkompressionsalgorithmus und JFIF, einer Variante diese Informationen abzuspeichern. Da letztere die gebräuchlichste ist, hab ich mir das mal gespart.

/edit2: Nochwas: ganz interessant ist vielleicht dann auch die Software JPEGsnoop (http://www.impulseadventure.com/photo/jpeg-snoop.html), mit der du erstmal ohne selber was zu programmieren JPEG-Datein analysieren kannst.

mfg

Gast
2009-11-05, 14:07:55
Du könntest natürlich den kompletten Inhalt posten und wir schauen uns das mal an ... ;D

Nichts leichter als das :D

Das Bild wird in einer Binärdatei gespeichert, die lad ich einfach mal hoch. Die Binärdatei hab ich soweit gekürzt, dass wirklich NUR NOCH die Bilddaten drinnen sind, keine andere Informationen mehr für Karte bzw. Lesegerät.

http://www.file-upload.net/download-1990628/picture.bin.html

Danke aber schonmal für deine Mühe ! :)

Gast
2009-11-05, 14:17:48
Achso, das muss man euch zwar bestimmt nicht sagen aber ich habe zum Öffnen der Binärdatei das Programm "Textpad" verwendet, ich hab sonst keinen Editor gefunden, der mir den Inhalt lesbar anzeigt.

ftp://download.textpad.com/pub/textpad5.3/txpdeu531.exe

Pinoccio
2009-11-05, 14:33:55
Nichts leichter als das :D

Das Bild wird in einer Binärdatei gespeichert, die lad ich einfach mal hoch. Die Binärdatei hab ich soweit gekürzt, dass wirklich NUR NOCH die Bilddaten drinnen sind, keine andere Informationen mehr für Karte bzw. Lesegerät.

http://www.file-upload.net/download-1990628/picture.bin.html

Danke aber schonmal für deine Mühe ! :)Die ersten 8 Bytes gehören nicht dazu, am Ende ist auch zu viel. Das Bild selber mit allem ist 0x1709 = 5897 Bytes lang.
Schneidet man die nichtzugehörigen Bytes am Anfang ab, wird die Datei von mehreren/allen Programmen korrekt als JFIF (steht ja auch drin) erkannt.
Lediglich (in Bezug auf die getesteten Programme) Irfanview hat das schon vorher erkannt.
Beschnitten kannst du sie auch mit JPEGsnoop analysieren.

Ist damit alles klar? Wenn nein, welche Fragen sind noch offen?

Achso, das muss man euch zwar bestimmt nicht sagen aber ich habe zum Öffnen der Binärdatei das Programm "Textpad" verwendet, ich hab sonst keinen Editor gefunden, der mir den Inhalt lesbar anzeigt.Pfui ;-). Nimm lieber einen richtigen HexEditor, zb. HxD (http://mh-nexus.de/en/hxd/).

mfg

Gast
2009-11-05, 14:50:48
Danke, der Editor gefällt doch gleich um einiges besser :)

Ich bin da einfach noch ziemlich planlos unterwegs, merkt man ja auch.

Ich denk, ich versuche es jetzt folgendermaßen:

1. Rohdaten einlesen (in Byte-Array?) und daraus wieder eine JPG-Datei erstellen

2. Das JPG wird dann halt in mein Auslesetool importiert mit der passenden Methode, das sollte kein Problem darstellen

Mir ist eben nach wie vor noch nicht wirklich klar, wie ich quasi das JPG aus den Rohdaten wiederherstelle.

Pinoccio
2009-11-05, 15:07:06
Mir ist eben nach wie vor noch nicht wirklich klar, wie ich quasi das JPG aus den Rohdaten wiederherstelle.Ein quick'n'dirty-Variante wäre, das ganze Bytegenau* einzulesen, woanders abzuspeichern und dann mit einer JPEG-Library** wieder einzulesen. Sehr wahrscheinlich kannst du dir auch den Speicher(wischen)schritt sparen, wie weiß ich nicht, hab ja von C(++) keine Ahnung. ;-)
Also irgendwie 1. mit 2., so wie du es ja vorschlägst.

* Der Anfang einer solchen Bilddatei ist FF D8 FF E0 (JPEG-JFIF File Header) , das Ende die Bytefolge FF D9, einfach danach suchen.
** Oder ist die Verwendung einer vorhanden Library nicht möglich? Dann wird es etwas haariger (i. S. v. mehr Arbeit (http://www.w3.org/Graphics/JPEG/itu-t81.pdf)).

mfg

Gast
2009-11-05, 15:10:20
Ein quick'n'dirty-Variante wäre, das ganze Bytegenau* einzulesen, woanders abzuspeichern und dann mit einer JPEG-Library** wieder einzulesen. Sehr wahrscheinlich kannst du dir auch den Speicher(wischen)schritt sparen, wie weiß ich nicht, hab ja von C(++) keine Ahnung. ;-)
Also irgendwie 1. mit 2., so wie du es ja vorschlägst.

* Der Anfang einer solchen Bilddatei ist FF D8 FF E0 (JPEG-JFIF File Header) , das Ende die Bytefolge FF D9, einfach danach suchen.
** Oder ist die Verwendung einer vorhanden Library nicht möglich? Dann wird es etwas haariger (i. S. v. mehr Arbeit (http://www.w3.org/Graphics/JPEG/itu-t81.pdf)).

mfg

Doch doch, eine vorhandene Library kann durchaus verwendet werden. Ich versuch mich da jetzt einfach mal ein bischen, vieleicht kommt ja am Ende was bei raus...wortwörtlich :)

Merci beaucoup soweit !

Gast
2009-11-05, 15:11:19
Ich hab gerade auch gesehn, dass das Ganze mit Java wesentlich einfach zu bewerkstelligen wäre. Leider ist das für uns keine Alternative...

Gast
2009-11-05, 19:06:39
Ich bin ein so dermaßen großer Vollidiot :D

Ich les einfach den Bildanteil auf der Karte aus, schreib diesen in ein neues Byte-Array, lass den Inhalt des Arrays in eine Datei schreiben, benenne diese einfach bild.jpg und schon hab ich mein Bildchen wieder...D'OH !!