none
Importing Images ( Tiff, Gif, Jpeg ) von Access 2010 nach Visual Basic /Picturebox RRS feed

  • 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)
    Mittwoch, 9. März 2011 05:21

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
    Freitag, 18. März 2011 12:22
    Moderator
  • 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
    Dienstag, 15. März 2011 07:13

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

    Freitag, 11. März 2011 16:19
    Moderator
  • 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

    Freitag, 11. März 2011 17:08
    Moderator
  • 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
    Samstag, 12. März 2011 01:22
  • 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
    Montag, 14. März 2011 08:55
  • 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

    Montag, 14. März 2011 16:44
    Moderator
  • 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
    Dienstag, 15. März 2011 07:13
  • 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
    Freitag, 18. März 2011 12:22
    Moderator
  • 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
    Dienstag, 22. März 2011 08:29
  • 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

    Dienstag, 22. März 2011 13:45
    Moderator