Bild von Acces-Datenbank in picturebox anzeigen..!
-
Ich kann mich nur wiederholen. Debugge an der Stelle welche ich dir schonmal gepostet habe und schau in das Array rein, ob du da überhaupt was valides bekommst.
-
Weil ich nicht weiterkomme, habe ich mal die projektmappe upgeloaded...
...vielleicht kann sich jemand der lust hat das angucken..!
Wie gesagt, habe das oben genannte problem mit dem Lesen eines Bildes von einer Acces-Datenbank.
Hier das Projekt...
Klick
-
Ah, ich sehe das Problem
Access scheint die Bilder in der Tabelle nicht direkt als Bitmap, jpeg oder sowas zu speichern sondern noch ein Ole-Objekt drumherum zu packen.
Damit kann Image.FromStream() nichts anfangen.
Du müsstest eine Möglichkeit finden das Bild aus dem Ole-Objekt irgendwie herauszubekommen
-
Danke geeky für deine Antwort..!
Das erklärt einiges..auch, dass der gleiche Code aber mit einer SQL-Datenbank und natürlich mit einem SQL-Data-Adapter ohne Probleme funtkioniert, weil da werden die bilder als binary-Daten gespeichert.geeky schrieb:
Du müsstest eine Möglichkeit finden das Bild aus dem Ole-Objekt irgendwie herauszubekommen
Hättest du vielleicht ne Idee wie ich das machen kann..?
-
Vielleicht hilft das hier:
http://bytes.com/topic/net/answers/740039-parse-ole-object-c
-
Danke, lese grad ein ähnlichen Artikel, nämlich den..:
http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/f716de15-b9f2-49a0-8ae8-624a190454de
Verstehe aber nicht die folgende Zeile..:ms.Write(byPicture, 78, byPicture.Length - 78);
Was ist mit der Zahl "78", was meint er mit offset 78 bits..??
Sonst habe mir überlegt es so zu machen (ist ja Copy-Paste von der Seite)..:
oleDbConnection1.Open(); OleDbCommand cmd = new OleDbCommand("SELECT bild FROM my_pic WHERE ID=1",oleDbConnection1); Byte[] byPicture; byPicture = (Byte[])cmd.ExecuteScalar(); oleDbConnection1.Close(); MemoryStream ms = new MemoryStream(); Bitmap bm; ms.Write(byPicture, 78, byPicture.Length - 78); bm = new Bitmap(ms); pictureBox1.Image = bm;
Aber leider bekomme ich eine Exception wieder mal.
Diesmal bekommtbm = new Bitmap(ms);
einen ungültigen Parameter, nämlich 'null'.
-
Scheinbar konnte man ab Byte 78 das Original-Bild rausfischen.
Schaut man sich die Datei im Hex-Editor an, würde bei deiner Datei der Offset 213 passen - Sowas sieht mir aber eher nach Fuschlösung aus ^^
-
Hast recht mit 213 geht es..!
Aber verstehe nicht wie du die Zahl 213 gefunden hast..!
Du meinst man sollte das Bild mit einem Hex-Editor öffnen, aber dann wo muss ich hinschauen..?Meine nächste Frage wäre dann, ob ich mit diesem Code nur dieses bild öffnen kann oder irgendein Bild..? (Denke mal diese offset-zahl ist ja nicht bei allen Bildern gleich, oder täusche ich mich..?)
Das meisnt du doch mit Fuschlösung..?
-
Bonafide schrieb:
(Denke mal diese offset-zahl ist ja nicht bei allen Bildern gleich, oder täusche ich mich..?)
Das meisnt du doch mit Fuschlösung..?Jo, ich vermute mal stark das diese Offset-Zahl nicht fest auf 213 sein wird.
Wenn man bei byPicture einfach mal als "daten.dat" oder so abspeichert und im Hex-Editor öffnet, fällt einem sofort "EXIF" ins Auge, bei EXIF wieder denkt man an Jpeg. Jpeg-Dateien bestehen aus "Markern".
"0xFF 0xD8" ist der "Start Of Image"-Marker, der befindet sich in der Datei genau nach 213 Bytes.
-
Achso verstehe..!
Und deine Vermutung ist richtig. Habe es mit anderen jpeg getestet und ich muss jedesmal diese offset-zahl rausfinden und ändern, damit das Bild angezeigt wird.Und das hilft mir natürlich nicht, da ich jedesmal anderes bild von der db laden will.
Was ist aber wenn ich jedesmal, wenn ich ein bild lade, diese offset-zahl rausfinde, bevor diese Zeile natürlich
ms.Write(byPicture, 203, byPicture.Length - 203);
und dann den rausgefundenen Wert weitergebe.
Geht sowas..?
Und wenn ja wie kompliziert ist es, weil wie du schon bemerkt hast, bin ich noch relativer anfäger..!