BMP Bild aus Access Datenbank lesen

Anfängerfragen zum Programmieren mit PureBasic.
Andy76
Beiträge: 11
Registriert: 07.02.2007 15:26

BMP Bild aus Access Datenbank lesen

Beitrag von Andy76 »

Hi

Gibt ese eine Möglichkeit ein OLE-Opjekt (BMP Bild)
mit GetDatabaseString auszulesen und dann
mit LoadImage und ImageGadget in einem Fenster darzustellen?

Bis jetz bin ich ziemlich gescheitert da LoadImage einen Dateinamen erwartet und keine Datenbank Spalte.

Gruß
Andy

Code: Alles auswählen

Siehe Post 4
Zuletzt geändert von Andy76 am 14.02.2007 16:14, insgesamt 1-mal geändert.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Hey ;)
Ist in dem String, den du da empfängst schon der Header für die Bilddatei schon drin, oder sind es "nur" die Bilddaten?
Wenn das so ein Bild ist, wie man es auch auf die Festplatte speichern könnte, würde es reichen, wenn du den empfangenen String,als "test.jpg" per "CreateFile()" abzuspeicherst.
Danach ist das Bild dann für LoadImage verfügbar.

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: BMP Bild aus Access Datenbank lesen

Beitrag von Kiffi »

Andy76 hat geschrieben:Gibt ese eine Möglichkeit ein OLE-Opjekt (BMP Bild)
mit GetDatabaseString auszulesen
das wird wohl nicht funktionieren, weil PB-Strings nullterminiert sind. Sprich:
Sobald das erste Chr(0) in einem String vorkommt, ist für PB dort der String
zu Ende. Und in einem Bild gibt's 'ne Menge Chr(0) ;-)

Schreibst Du die Bilder in die Datenbank oder greifst Du auf eine Datenbank
zu, in der die Bilder schon vorhanden sind und Du musst sie 'nur' auslesen?

Grüße ... Kiffi
a²+b²=mc²
Andy76
Beiträge: 11
Registriert: 07.02.2007 15:26

Beitrag von Andy76 »

Hi

die Bilder sind bereits in der Datenbank.
Ich möchte nur auslesen und in einem ImageGadget darstellen.

Ob da ein header vorhanden ist weiß ich nicht, denke aber schon.
Access öffnet bei Doppelklick das dazugehörige Verknüpfte Programm
(MSPaint).

Das mit CreateFile werd ich ausprobieren.

Ich möchte eigentlich ein kleines Programm erstellen mit dem ich durch die
Datenbank durchblättern kann und neben den normale Dateinbankeinträgen
auch das dazugehörende Bild angezeigt wird.

An dem Auslesen des Bildes aus der Datenbank scheitere ich im Moment.

Gruß
Andy
Andy76
Beiträge: 11
Registriert: 07.02.2007 15:26

Beitrag von Andy76 »

Hi

das Abspeichern des bildes in der Datenbank mit CreateFile hat geklapt, aber leider
ist das was Gespeichert wird kein BMP File und etwa doppelt so
groß wie das Orginal Bild.

Hier der Code:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 245, 105, "Bild aus Datenbank", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    
   ;Datenbank öffnen
    
  If InitDatabase() 
        Database = OpenDatabase(0,"Test2", "", "") 
        If Database = 0 
          MessageRequester("Information", "Datenbank nicht gefunden!")
        EndIf   
  EndIf
        
        
      If  DatabaseQuery(0, "Select * from Tabelle") ;Datenbank Abfrage
 
        NextDatabaseRow(0) ;erste Reihe wird gewält
 
        Bild.s=GetDatabaseString(0,2) ; 2te Spalte lesen, (dort ist das BMP Bild)
        
        
        ;ausgelesenen String aus Reihe 0 und Spalte 2  in Datei schreiben
        
            If CreateFile(0, "c:\test.bmp")  ; BMP File wird erstellt
                WriteString(0, Bild.s)  ; zuvor ausgelester String Bild.s wird in Datei geschrieben
                CloseFile(0)  ; schließt und speichert die Datei
            Else
                MessageRequester("Information","Konnte Datei nicht erstellen!")
           EndIf
           
       EndIf

    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

@Andy76 : Du musst Dich da mal mit den Access Internas beschäftigen.

Entweder ist das Bild Base64 codiert, dann kann man es tatsächlich
als String via ODBC laden, oder es ist als BLOB ( Binary Large Object )
gespeichert, dann kannst Du das auch nur mit einem entsprechenden
Database Befehl machen, der Dir keinen String liefert, sondern einen
Zeiger auf einen Speicherbereich...

Vermutlich ist das Bild auch als PNG und nicht als BMP gespeichert,
das machen zumindest Word und PowerPoint so ...
Dieses Format enthält eine verlustfreie Komprimierung.
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

ACCESS hat meiner Vermutung nach auch die dumme Angewohnheit bereits gelöschte Datenbank einträge, vor allem Bilder, in seiner Datei weiterhin abzuspeichern. Dadurch werden diese Access-Dateieien schon bei ein paar Änderungen nicht mehr wirklich transportierbar.

Wenn du dahinter gekommen bist, wie es geht, dann gibt Bescheid.

Ich kenn mich selbst mit dem Access-Format nicht aus. Hab Version 2.0 und 4.0 ... ich glaub, die können auch noch kein PNG.

Vielleicht machst ja ein OpenSource draus oder teilst und deine Erkenntnisse mit. Mich interessierts auf jeden Fall. :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

dige hat geschrieben:Vermutlich ist das Bild auch als PNG und nicht als BMP gespeichert, das machen zumindest Word und PowerPoint so ...
Microsoft und PNG? Das wäre ja Kollaboration mit dem OpenSource-Feind! :lol:
Und der IE hatte es lange Zeit auch nicht so mit PNG-Grafiken, deshalb haben viele Webseiten auf PNG verzichtet, um nicht inkompatibel zu sein.

back to topic:
Access speichert m.W. Bilder intern nur im WMF-Format (Windows Meta File), d.h. JPGs würden die MDB mächtig aufblähen. Will man JPGs vernünftig in Access speichern, muss man sie binär speichern. Das geht m.W. nur über OLE-Objekte, guck mal hier bei Microsoft. Aber frag mich nicht, wie das als PB-Code aussehen müsste ... :oops:
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Darf ich eine Zwischenfrage stellen?

Ich hab mir jetzt hier einige QuellCodes im Forum zum Thema Datenbanken angesehen, aber ich verstehe immer noch nicht, wie es funktioniert.

Wie sieht zum Beispiel der QuellCode aus, wenn ich eine *.CSV-Datei habe?

DatenBank Name: Test.CSV

Spalte 1; Name; Uhrzeit; Zahl; Besen;
Nix; Folker; 12:06; 100; Schraubstock;
Irgendwas; Heinz; 2005-12-24; 3,8; Weihnachten;


Wenn ich jetzt alle Namen gelistet haben möchte, wäre das doch irgendwie so:

SELECT Name FROM Test.CSV

>> Folker, Heinz


Frage eins! Wie komm ich dahin, dass ich diesen Befehl einfach eingeben kann und wo landet dann die Ausgabe? In einem Array?

Kann jemand mir sagen, wo ich ein Beispiel CODE in PB finde, der diese simple Aufgabe verständlich löst ...

Oder vielleicht hier gleich anhängt ...


Und wenn über Excel oder Access gesprochen wird, woher weiß PB wie es diese Tabellen zu entschlüsseln hat? Ich will doch nicht jedes Mal irgendwelche komischen DatenBankTreiber-Dialoge auf meinem Bildschirm haben. Es soll einfach nur klappen :praise:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

stbi hat geschrieben:
dige hat geschrieben:Vermutlich ist das Bild auch als PNG und nicht als BMP gespeichert, das machen zumindest Word und PowerPoint so ...
Microsoft und PNG? Das wäre ja Kollaboration mit dem OpenSource-Feind! :lol:
Und der IE hatte es lange Zeit auch nicht so mit PNG-Grafiken, deshalb haben viele Webseiten auf PNG verzichtet, um nicht inkompatibel zu sein.

back to topic:
Access speichert m.W. Bilder intern nur im WMF-Format (Windows Meta File), d.h. JPGs würden die MDB mächtig aufblähen. Will man JPGs vernünftig in Access speichern, muss man sie binär speichern. Das geht m.W. nur über OLE-Objekte, guck mal hier bei Microsoft. Aber frag mich nicht, wie das als PB-Code aussehen müsste ... :oops:
@stbi: :lol: Mann öffne einfach mal Word, füge mit Copy&Paste ein Bild
ein und speichere diese Datei.
Wenn Du nun mit einem Hex-Editor die Datei anschaust wirst Du
folgenden ImageFileHeader finden: PNG IHDR
Mit PureBase und dem PNG_Decoder kannst Du dieses Bild auch wieder
"catchen".
Nicht umsonst gibt es sogenannte Words / Powerpoint Kompressor
Tools, die einfach das PNG mit JPG ersetzen.
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten