Benutzer mit den meisten Antworten
Importing Images ( Tiff, Gif, Jpeg ) von Access 2010 nach Visual Basic /Picturebox

Frage
-
In meiner Access 2010 Datenbank befinden sich hunderte Tiff-Files als OLE-Objekte abgelegt.
Wie lassen sich diese Dateien unter VB 2010 aufrufen und in einer PictureBox darstellen ???
- Verschoben Robert BreitenhoferModerator Freitag, 11. März 2011 16:20 Visual Basic.NET (aus:Visual Basic 6.0 - Interoperabilität und Upgrade)
Antworten
-
Hallo Ao La Fu,
Bei mir, zum Beispiel, Funktionierte dieses Programm einwandfrei (http://lebans.com/DownloadFiles/ExtractInventoryOLEver89.zip).
Habe folgendes gemacht:
Eine .accdb Datenbank erstellt mit einer einzigen Tabelle (Table1) die zwei Felder enthält (ID als AutoNumber und MyPicture als OLE Object). Das Feld MyPicture würde per Drag&Drop mit mehreren Bildern Dateien gefüllt (.jpg, .bmp und natürlich auch .tif).
Alle wurden mit dem obigen Programm erfolgreich von der Datenbank auf die Festplatte exportiert. Ich konnte, vor dem Export, die Packages auch sehen mithilfe der Registerkarte „Display Inventory of OLE Field“
****************************************************************************************
Ich glaube es wäre hilfreich um zu sehen was bei Dir in dem OLE Object Feld drinnen ist und versuchen irgendwie nur das „reine“ Bild aus einer einzigen Zeile zu extrahieren. Wenn Du kannst, möchte ich Dich bitten folgenden Code bei Dir anpassen und die resultierende Datei (output.bin) hier im Forum posten (also nur der Link zu der Datei posten indem Du die Datei auf SkyDrive hochlädst).
[VB.NET CODE]
Imports System.Data.OleDb Imports System.IO Public Class Form1 Dim aConnection As OleDbConnection Dim aCommand As OleDbCommand Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '//Database connection aConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Proiecte\Database1.accdb;Persist Security Info=False;") aConnection.Open() '//Command object und SQL Query aCommand = New OleDbCommand("SELECT MyPicture FROM Table1 WHERE ID=8", aConnection) Dim img As Byte() = DirectCast(aCommand.ExecuteScalar, Byte()) Dim ms As New MemoryStream ms.Write(img, 0, img.Length) '//************************************************************ '// Stream --> Byte Array Dim _ByteArray As Byte() = ms.ToArray() '// Open file --> zum schreiben Dim _FileStream As System.IO.FileStream = New System.IO.FileStream("C:\Proiecte\Output\output.bin", System.IO.FileMode.Create, System.IO.FileAccess.Write) '// Bytes --> stream _FileStream.Write(_ByteArray.ToArray(), 0, _ByteArray.Length) '// Close stream _FileStream.Close() '// Cleanup ms.Close() ms.Dispose() End Sub End Class
****************************************************************************************
Grüße,
Robert
- Als Antwort markiert Ao La Fu Dienstag, 22. März 2011 08:30
-
Hallo Robert,
ich habe probiert die OLE-Objekte auf meine Festplatte zu exportieren.
Infos von Lebans' Programm : Exporting all records, Export completed ( gibt die exakte Record-Anzahl meiner Datenbank an )
aber : 0 records exported, keine Datei in den vorbereiteten Ordner extrahiert.
D.h.: Der Versuch mit Lebans' Programm ist nicht geglueckt.
Viele Gruesse
Ao La Fu
Ao La Fu- Als Antwort markiert Ao La Fu Dienstag, 22. März 2011 08:34
Alle Antworten
-
Hallo Ao La Fu,
Könntest Du bitte Dein Problem deutlicher und völlig beschreiben? Im Titel steht „Importing Images ( Tiff, Gif, Jpeg ) von Access 2010 nach Visual Basic /Picturebox“…aber nachher sagst Du: „In meiner Access 2010 Datenbank befinden sich hunderte Tiff-Files als OLE-Objekte abgelegt“
Ich Frage nach weil das gibt es mehrere Diskussionen wegen verschieden Formate, und weil Tiff schwieriger ist weil da gibt es mehrere Standarte…und dann gibt es noch das hier:
Ole and accessing files embedded in Access part #1
Ole and accessing files embedded in Access part #2
*******************************************************************************************
Ein ziemliches Workaround das für JPEG und BMP Formate funktioniert findest Du hier: Picture Extraction from MS Access
Danke und Grüße,
Robert
-
Noch ein paar zusätzliche Informationen:
Removing OLE Header from images stored in MS Access DB as OLE Object (Frage hier: Wie sind die Tiff Dateien in der Datenbank angekommen…manuell durch Access eingefügt oder „programmatically“?)
http://lebans.com/DownloadFiles/ExtractInventoryOLEver89.zip -> Extrahiert die OLE-Objekte auf der Festplatte
-
Hallo Robert,
vielen Dank fuer Dein Interesse an meiner Frage !
Das Schoene an MS-Access Datenbanken ist, das sie leicht mit Daten per Drag and Drop gefuellt werden koennen.
So auch in diesem Fall, die Tiff-Dateien wurden durch manuelles Verschieben in die Datenbank kopiert.
Mit Visual Basic 2010 ( prof.) habe ich bereits Verbindung zur Datenbank via :
Dim con As New OleDbConnection Dim cmd As New OleDbCommand Dim reader As OleDbDataReader con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=E:\Datenbank\Noten.accdb"
erfolgreich aufgenommen und Daten ( string / integer ) ausgelesen und weiter verarbeitet.
Nur fuer die Uebertragung von OLE-Objekten ( hier Tiff-Files ) in die PictureBox finde ich keine Loesung.
Ueber weitere Anregungen/Hilfen wuerde ich mich sehr freuen.
Dank und Gruss
Ao La Fu
Ao La Fu- Bearbeitet Robert BreitenhoferModerator Montag, 14. März 2011 09:12 Formatierung
-
Hallo Robert,
Deine angehaengten Verweise sind alles Beispiele in Visual C# oder C++, die mir leider so direkt nicht weiterhelfen.
Bist Du noch weiter an diesem Problem dran oder hast Du es schon als erledigt abgehakt ??
Viele Gruesse
Ao La Fu
Ao La Fu -
Hallo Ao La Fu,
Bin noch an Deinem Problem dran.
Da ich jetzt weiß dass Du die .tif Dateien per Drag and Drop in die Datenbank gefüllt hast, möchte ich Dich bitten, nochmals mit dem http://lebans.com/DownloadFiles/ExtractInventoryOLEver89.zip Projekt zu arbeiten und die OLE-Objekte auf der Festplatte zu extrahieren (bei den Knopf Select MDB… im obigen Projekt kannst du auch eine .accdb Datei angeben)
Bitte melde dich ob die Dateien sich auf der Festplatte erstellen lassen und ob man sie per Doppelklick mit ansehen kann.
Danke und Grüße,
Robert
-
Hallo Robert,
ich habe probiert die OLE-Objekte auf meine Festplatte zu exportieren.
Infos von Lebans' Programm : Exporting all records, Export completed ( gibt die exakte Record-Anzahl meiner Datenbank an )
aber : 0 records exported, keine Datei in den vorbereiteten Ordner extrahiert.
D.h.: Der Versuch mit Lebans' Programm ist nicht geglueckt.
Viele Gruesse
Ao La Fu
Ao La Fu- Als Antwort markiert Ao La Fu Dienstag, 22. März 2011 08:34
-
Hallo Ao La Fu,
Bei mir, zum Beispiel, Funktionierte dieses Programm einwandfrei (http://lebans.com/DownloadFiles/ExtractInventoryOLEver89.zip).
Habe folgendes gemacht:
Eine .accdb Datenbank erstellt mit einer einzigen Tabelle (Table1) die zwei Felder enthält (ID als AutoNumber und MyPicture als OLE Object). Das Feld MyPicture würde per Drag&Drop mit mehreren Bildern Dateien gefüllt (.jpg, .bmp und natürlich auch .tif).
Alle wurden mit dem obigen Programm erfolgreich von der Datenbank auf die Festplatte exportiert. Ich konnte, vor dem Export, die Packages auch sehen mithilfe der Registerkarte „Display Inventory of OLE Field“
****************************************************************************************
Ich glaube es wäre hilfreich um zu sehen was bei Dir in dem OLE Object Feld drinnen ist und versuchen irgendwie nur das „reine“ Bild aus einer einzigen Zeile zu extrahieren. Wenn Du kannst, möchte ich Dich bitten folgenden Code bei Dir anpassen und die resultierende Datei (output.bin) hier im Forum posten (also nur der Link zu der Datei posten indem Du die Datei auf SkyDrive hochlädst).
[VB.NET CODE]
Imports System.Data.OleDb Imports System.IO Public Class Form1 Dim aConnection As OleDbConnection Dim aCommand As OleDbCommand Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '//Database connection aConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Proiecte\Database1.accdb;Persist Security Info=False;") aConnection.Open() '//Command object und SQL Query aCommand = New OleDbCommand("SELECT MyPicture FROM Table1 WHERE ID=8", aConnection) Dim img As Byte() = DirectCast(aCommand.ExecuteScalar, Byte()) Dim ms As New MemoryStream ms.Write(img, 0, img.Length) '//************************************************************ '// Stream --> Byte Array Dim _ByteArray As Byte() = ms.ToArray() '// Open file --> zum schreiben Dim _FileStream As System.IO.FileStream = New System.IO.FileStream("C:\Proiecte\Output\output.bin", System.IO.FileMode.Create, System.IO.FileAccess.Write) '// Bytes --> stream _FileStream.Write(_ByteArray.ToArray(), 0, _ByteArray.Length) '// Close stream _FileStream.Close() '// Cleanup ms.Close() ms.Dispose() End Sub End Class
****************************************************************************************
Grüße,
Robert
- Als Antwort markiert Ao La Fu Dienstag, 22. März 2011 08:30
-
Hallo Robert,
vielen Dank fuer Deine Hilfe !!! Genau diese drei Schritte ( Stream --> Byte Array, Open file --> zum Schreiben, Bytes --> Stream ) haben mir gefehlt, um den Inhalt des OLE-Objektes der Access Datenbank zu analysieren.
Dein VB.NET Code hat mich die output.bin-Datei erzeugen lassen. Sie besteht aus der kompletten Tiff-Datei plus einem in der Laenge variablen Header, den MS-Access erzeugt und vorgestellt hat ( Hexedit als Analyse-Tool genommen ). Wird dieser Header von der Datei entfernt, so erhaelt man wieder die herkoemmliche Tiff-Datei. Als Kennung ( fuer meine Anwendung ausreichend ) dieser Tiff-Datei habe ich "II*" ( = Hex : 49 49 2A ) identifiziert. Mit geeigneten GIF-, JPEG- oder anderen Formate Kennungen laesst folgendes Programm auch fuer andere Datei-Formate verwenden.
Auch die Uebertragung der Array-Werte in die Picture-Box habe ich vollzogen.
Sub Haupt2() Dim con As New OleDbConnection Dim cmd As New OleDbCommand con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=E:\Datenbank\Noten.accdb" con.Open() cmd.Connection = con 'MyPicture enthaelt die Tiff-Files ( OLE-Objekte, handverschoben ), ID ist eine Zaehlnummer cmd.CommandText = "select MyPicture from Table1 where ID= 1" Dim MeinOLEDatenfeld As Byte() Dim MeinStream As New MemoryStream Dim imgMemoryStream As New MemoryStream Dim MeinByteArray As Byte() = Nothing Dim MeinByteArray_gekuerzt As Byte() = Nothing Dim MeinFileStream As System.IO.FileStream Dim i, Anfang, k As Integer Dim img As Image MeinOLEDatenfeld = DirectCast(cmd.ExecuteScalar, Byte()) MeinStream.Write(MeinOLEDatenfeld, 0, MeinOLEDatenfeld.Length) MeinByteArray = MeinStream.ToArray() Anfang = 0 'Tiff-Header startet mit folgenden Zeichen : II* das ist in Hex-Code = H49 H49 H2A 'folgende for Schleife sucht die Zeichenfolge II* , merkt sich deren Position im Array ( Anfang ) For i = 0 To MeinByteArray.Length If MeinByteArray(i) = &H49 Then If MeinByteArray(i + 1) = &H49 Then If MeinByteArray(i + 2) = &H2A Then Anfang = i Exit For End If End If End If Next i 'Definiert die Laenge des verkuerzten Arrays ReDim MeinByteArray_gekuerzt(MeinByteArray.Length - Anfang) k = 0 'Kopiert den Datenbank-Array minus Access-Header '=> reine Tiff-Datei !!! For i = Anfang + 1 To MeinByteArray.Length - 1 MeinByteArray_gekuerzt(k) = MeinByteArray(i - 1) k = k + 1 Next i 'Speichert zum Analysieren den Inhalt eines OLE Object Feldes auf die Festplatte 'a.) als bin-Datei 'MeinFileStream = New System.IO.FileStream("E:\aaa\asdf.bin", System.IO.FileMode.Create, System.IO.FileAccess.Write) 'MeinFileStream.Write(MeinByteArray.ToArray(), 0, MeinByteArray.Length) 'b.) als Access-Header bereinigte Tiff-Datei 'MeinFileStream = New System.IO.FileStream("E:\aaa\asdf.tif", System.IO.FileMode.Create, System.IO.FileAccess.Write) 'MeinFileStream.Write(MeinByteArray_gekuerzt.ToArray(), 0, MeinByteArray_gekuerzt.Length) 'Uebertraegt den Header bereinigten Array in die PictureBox ( hier PB1 ) imgMemoryStream = New IO.MemoryStream(MeinByteArray_gekuerzt) img = Drawing.Image.FromStream(imgMemoryStream) PB1.Image = img 'PictureBox1 MeinFileStream.Close() imgMemoryStream.Close() MeinStream.Close() MeinStream.Dispose() con.Close() End Sub
Ao La Fu- Bearbeitet Robert BreitenhoferModerator Dienstag, 22. März 2011 13:38 Formatierung
-
Hallo Ao La Fu,
Es freut mich dass Du es lösen könntest.
Hier wird zum Beispiel durch die ersten 300 Zeichen eines String nach const string TIFF_ID_BLOCK = "II*\u0000"; gesucht. Ähnlich so wie Du es gemacht hast aber in C# J
Removing OLE Header from images stored in MS Access DB as OLE Object
Grüße und Erfolg,
Robert