# OLE -> jpg -> lokal speichern



## AleX (26. Mai 2003)

hi,
leider hab ich schon wieder ein Problem und komm einfach nicht weiter.
Drum hoffe ich jetzt hier auf Hilfe 

Mein Problem:
Ich lese mit VB6.0 aus einer MS Access Datenbank Bilder, die in dieser als OLE-Objekte liegen aus. 
Diese werden auch korrekt in der Anwendung dargestellt, doch nun möchte ich diese lokal als normales jpg abspeichern.

Hab im Web und in diversen Foren nichts gefunden :-/

Bitte um Hilfe, schon mal im Vorraus danke
alex

UPDATE fürs Verständnis, ich stelle das pic in der Anwendung momentan in einer OLE-Komponente dar.


----------



## Dario Linsky (26. Mai 2003)

Sieh Dir mal die Funktion *SavePicture* etwas näher an, damit kannst Du den Inhalt eines Image- oder PictureBox-Controls als Datei abspeichern.
Ob das direkt als Jpeg möglich ist, weiss ich aber nicht - evtl. musst Du die Konvertierung von Bitmap nach Jpeg also zusätzlich noch machen.


----------



## AleX (26. Mai 2003)

jo, kenn ich schon.
Bringt aber halt nichts, da es gedacht ist ein jpg, giff ...
zu speichern und nicht wenn als rohdaten ein OLE-Objekt übergeben wird.
Zumindest siehts so aus. Er bringt dann als Fehler (Typen unverträglich)


----------



## Dario Linsky (26. Mai 2003)

Zeig mal Deinen Code und markier bitte die Zeile, bei der der Compiler einen Fehler ausspuckt.
In was für einem Objekt zeigst Du das Bild an und kannst Du das als Bitmap speichern? Wenn ja, dann gibt es etliche Beispielcodes (bei Planet Sourcecode z.B.) wie Du das in ein Jpeg umwandeln kannst.


----------



## AleX (2. Juni 2003)

hi, also code hab ich ja im Moment noch garkeinen.  

Im Moment:
Ich hab nen DataFeld *data1* dem als Databasename die Access-DB angegeben ist.
Dann hab ich ein OLE-Feld, das als Datasource *data1* und als DataField Bild (<- der Name der Spalte in der AccessDB, in der die Bilder als OLE-Objekte hängen)angegeben hat.

Nun kann ich mit dem *data1* die Zeilen in der AccessDB nacheinander durchspringen und unten wird mir das OLE Objekt im OLE-Feld als Bild korrekt angezeigt.

Leg ich jetzt die selben eigenschaften des OLE-Feldes auf ein Image-Feld, kommt beim durchspringen der Bilder jedes mal die Fehlermeldung "Ungültiges Bild". <- Das ist ja auch klar, da in dem Ole noch der OLE-Header hängt usw...
Aber wie bekomem ich den weg, so dass ich das dargestellte 'Bild' als jpg abspeichern kann.

Hoffe dass das nun verständlich ist. ;-) 
Sorry, wenns das beim ersten mal nicht wirklich war. Ist nur leider so, dass ich noch nie was mit VB gemacht hab und das nur ein Ausnahmefall ist, da das ganze per Java noch vielll schwerer ist.

alex


----------



## Thomas Darimont (2. Juni 2003)

Servus!

Vielleicht hilft das hier ... ;-)

für JPG guckst du hier:

http://www.vbarchiv.net/archiv/tipp_details.php?pid=425

Gruss Tom


----------



## AleX (3. Juni 2003)

hi tdar2.

Danke, hilft mir aber leider auch nicht weiter.
In dem Beispiel ist das Bild ja von anfang an ein Image und nie ein OLE-Objekt.

Mein Problem ist, ich hab jetzt ein OLE-Objekt und will das als Bild speichen.

Das Bild sehe ich ja auch nur, wenn ich es einer OLE-Komponente hinzufüge. Wenn ich es einem Image übergeben will kommt ja der fehler, dass es ein ungültiges Bild ist.

Bitte, ist wichtig, kann mir denn keiner weiterhelfen?


----------



## Dario Linsky (3. Juni 2003)

Ich bin nicht ganz sicher, wie bei MS Access die Inhalte für binäre Felder verwaltet werden. Aber soweit ich weiss, werden in diesen Feldern die einzelnen Bytes der Binärdatei gespeichert.
Mit anderen Worten: Du kannst wahrscheinlich einfach die Bytefolge als Array auslesen und in eine Binärdatei schreiben.

Ob das klappt, kann ich Dir allerdings nicht definitiv sagen. Ist nur eine Vermutung...


----------



## Thomas Darimont (3. Juni 2003)

Servus!

Wenn du das Bild, wie in meinem Beispiel per Drag'n'Drop aus dem "Drag" Kasten heraus, in den Dropkasten verschiebst, verwandelt sich das Bild auch in ein "OLE-Image" ... deswegen "caste" ich ja mit Data.getData(VBCFImage) ...

`Gibt glaube ich noch vbCFDIB (Device Independent Bitmap) und vbCFMETA ... versuchs doch mal mit einen der beiden ...

Musst eben nur die Datan aus der DB lesen und sie in den entsprechenden Datentyp "Casten" (Umwandeln) ---> vbCFImage bzw. alternativen... wenn du die Daten dann mal hast, kannst due sie mit der DLL wie im Link beschrieben als JPG speichern ...

Gruss Tom


----------



## Thomas Darimont (3. Juni 2003)

Servus!



> Ich bin nicht ganz sicher, wie bei MS Access die Inhalte für binäre Felder verwaltet werden. Aber soweit ich weiss, werden in diesen Feldern die einzelnen Bytes der Binärdatei gespeichert.



Das klappt auch, aber nur, wenn die Bilder auch als "byte Stream" in die DB gelangt sind ...(hab ich schon mal in der Java Ecke Demonstriert)  sind sie jedoch per Drag'n'Drop oder per "Objekt-> Einfügen->Bitmap" eingefügt worden, sind es ganz normale OLE Objekte... um an die Bilder heran zu kommen, müssen sie jedoch zuerst mittels eines Casts aus dem "OLE-Container" heraus gezogen werden.

Gruss Tom


----------



## AleX (3. Juni 2003)

danke tdar2,

allerdings hab ich halt das problem, dass ich nciht am Anfang ein Image hab, sondern gleich ein OLE-Objekt und das kann ich man nicht per drag&drop rumschieben bzw. es gibt dafür keine OLEDragAllowed  

Sorry, bin ein Visual Basic noob und möchte nur wissen, welche Zeile code ich benötige, um das in der OLE1-Komponente dargestellte Bild in eine Image oder Picture-Komponente zu kriegen.


```
Private Sub Command2_Click()
Image1 = OLE1
End Sub
```
^- wenn ichs so mach, kommt "Typen unverträglich"

Also muss ich hier doch das mit dem "*.GetData(vbCFBitmap)" machen.
Aber wie komm ich an die Daten.

Tut mir ja leid wenn ich euch nerf, aber komm da allein echt nicht weiter


----------



## Thomas Darimont (3. Juni 2003)

Servus!

Hab jetzt mal in diversen Foren/Newsgroups und Chat's nachgefragt ... dass scheint eine recht aufwendige Sache zu sein, diese Bilder(wenn sie mit Access selbst per OLE hinein geschoben wurden) wieder auszulesen... eine Möglichkeit, die ich gefunden habe, war die das Bild aus der Access Datei mit einer speziellen DLL( nicht von Microsoft) in eine temporäre Datei zu speichern wieder auszulesen, auf der Form zu zeigen und die temp Datei zu löschen ... dabei entsteht jedoch ziemlich viel overhead, so dass von dieser Lösung eher abzusehen ist ...

Ist es denn so viel Aufwand in der Access DB nur die Pfade zu den Grafiken zu speichern? Bzw. wieso machst du dein Projekt nicht gleich ganz mit Access? Da geht das Bilder anzeigen super leicht und du hast auch (fast) die gleichen Steuerelemente wie mit VB allein ...
VBA ist je ein VB Derivat ...

Frag mal nach, ob es keine Alternative gibt, das Projekt ganz als Access Anwendung zu implementieren...

Gruss Tom


----------



## AleX (3. Juni 2003)

hi, erst mal danke dass dir so viel Mühe machst.

Also im Grunde mach ich eine Java-Anwendung die eine Access DB ausliest mit Bildern und dann das ganze Zeug per DIIOP einem Lotus Notes Server überträgt und dort in der Datenbank Dokumente erstellt. Jeweils mit Daten und dem dazugehörigen Bildern.

Doch da ich das Auslesen der Bilder per Java nur geschaft habe, wenn ich sie davor mit einem Stream direkt reingeschrieben habe, aber nicht wenn sie per drag&drop in die Datenbank eingefügt wurden, (<-wie es leider der Fall ist) brauche ich jetzt irgendetwas, was die Tabelle mit den Bildern von oben nach unten durchläuft und alle Bilder als jpg oder gif (oder von mir aus auch vorerst mal als bmp) lokal mit einer id als name abspeichert und meine Java-Anwendung diese dann beim hochladen der restlichen Daten auffast.

Also kanns von mir aus auch komplett in Access gelöst sein. Gegen eine C++ Lösung oder was anderes hätte ich auch nichts einzuwänden. Hauptsache diese Woche hab ich was, was die über 500 Bilder ausliest.

Gruß alex
^- me ist offen für jede Art von Vorschlag


PS: wegen purer AccessLösung: http://www.lebans.com/oletodisk.htm hab ich schon versucht, doch obwohl die dll im system root liegt, bringt er bei jedem bild einen error beim Abspeichern.


----------



## AleX (4. Juni 2003)

und das Java Teil ist schon fertig und voll funktionsfähig.

Lediglich die Bilder fehlen noch  
und die brauch ich unbedingt.

alex


----------

