Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Wie speichere ich ein DB-Blob in ein TImage (https://www.delphipraxis.net/181795-wie-speichere-ich-ein-db-blob-ein-timage.html)

LingNeu 9. Sep 2014 16:12

Wie speichere ich ein DB-Blob in ein TImage
 
Hallo Programmierfreunde,
vor kurzem habe ich eine perfekte Hilfe durch himitsu bekommen. Ich wollte damals ein Bild (TImage) in eine Datenbank abspeichern. Dank himitsu habe ich das dann geschafft.
Jetzt probiere ich schon die ganze Zeit herum, anders herum das hinzubekommen. Ich habe ein Bild in der Datenbank und möchte diese auf einem normalen TImage anzeigen lassen.
Bei dem nachfolgendem Quelltext kommt keine Kompilierfehlermeldung. Erst wenn ich die Prozedure auslöse erhalte ich eine Exception der Klasse EInvalidGraphic bzw. die Bitmap ist ungültig.
Vielleicht kann mir jemand von euch einen Hinweis geben. Besten Dank!

Delphi-Quellcode:
procedure TForm1.btn_ObjektClick(Sender: TObject);
var sname1,sname2: string;
ms: TMemoryStream ;
begin
ed_Name1.text      := TDB_O['oName1']; //vorhandene DB-Daten in TextEdit kopieren
ed_Name2.Text      := TDB_O['oName2']; //vorhandene DB-Daten in TextEdit kopieren
//Jetzt noch DB-Bild in ein TImage (img_Objekt) bringen
if not VarIsNull(TDB_O['oBild']) then begin
   ms  := TMemoryStream.Create ;
   TBlobField(TDB_O.FieldByName('oBild')).SaveToStream(ms);
   ms.Position := 0;
   img_Objekt.Picture.Bitmap.LoadFromStream(ms);
   ms.Free ;
end;
end;

mkinzler 9. Sep 2014 17:06

AW: Wie speichere ich ein DB-Blob in ein TImage
 
In was für einem Format ist das Bild in der Datenbank gespeichert?

Perlsau 10. Sep 2014 03:25

AW: Wie speichere ich ein DB-Blob in ein TImage
 
Delphi-Quellcode:
Function TDatMod.BlobFeldInStream(Strom: TMemoryStream; Feld: TField): Boolean;
Var
   S : TStream;
begin
   Result := False;
   If Not Feld.IsBlob Then Exit;
   If Feld.IsNull    Then Exit;
   S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
   Try
     Strom.Clear;
     Strom.CopyFrom(S,S.Size);
     Result := True;
   Finally
     S.Free;
   End;
end;
Bei Jpeg-Grafiken ist die Unit JPEG einzubinden.

LingNeu 10. Sep 2014 10:54

AW: Wie speichere ich ein DB-Blob in ein TImage
 
@mkinzler,
meistens ist das ein Jpg-Bild. In der Uses ist jpeg eingebunden.
ich habe auch Folgendes schon probiert ... ohne Erfolg.
gruss LingNeu

Delphi-Quellcode:
procedure TForm1.btn_ObjektClick(Sender: TObject);
var sname1,sname2: string;
ms: TMemoryStream ;
begin
ed_Name1.text := TDB_O['oName1']; //vorhandene DB-Daten in TextEdit kopieren
ed_Name2.Text := TDB_O['oName2']; //vorhandene DB-Daten in TextEdit kopieren
//Jetzt noch DB-Bild in ein TImage (img_Objekt) bringen
if not VarIsNull(TDB_O['oBild']) then begin
   ms := TMemoryStream.Create ;
   TBlobField(TDB_O.FieldByName('oBild')).SaveToStream(ms);
   ms.Position := 0;
   img_Objekt.Picture.Graphic.LoadFromStream(ms);
   ms.Free ;
end;
end;
@Perlsau,
danke für das Beispiel.
Leider bring ich den Code nicht zum Laufen. Trotzdem danke!

DeddyH 10. Sep 2014 10:57

AW: Wie speichere ich ein DB-Blob in ein TImage
 
Wenn Du die Grafik aus dem Stream mal auf der Festplatte abspeicherst (ms.SaveToFile), erhältst Du dann eine gültige Datei?

himitsu 10. Sep 2014 11:12

AW: Wie speichere ich ein DB-Blob in ein TImage
 
LoadFromFile erstellt die passende TGraphic-Instanz im Picture.Graphic, anhand er Dateiendung.
Es gibt keinen Code, welcher sich den Dateiinhalt ansieht, weswegen man bei LoadFromStream auch immer "selber" dafür sorgen muß, daß auch das richtig Grafikfirmat geladen ist, wo man dann das Bild reinladen kann.

Wenn es ein JPeg ist, dann mußt du selber erstmal ein TJpegImage (oder wie das heißt) erstellen und dem Graphic zuweisen, bevor da das Bild rein kann.
Nur für sowas wie Bitmap und Icon gibt es Property im Picture, welche das Format automatisch erstellen.

Alternativ kannst du Picture.LoadFromFile verwenden und muß dafür aber die Datei erstmal auf die Festplatte speichern (mit der richtigen Dateiendung).

Perlsau 11. Sep 2014 00:07

AW: Wie speichere ich ein DB-Blob in ein TImage
 
Zitat:

Zitat von LingNeu (Beitrag 1271982)
@Perlsau, danke für das Beispiel. Leider bring ich den Code nicht zum Laufen. Trotzdem danke!

Das ist ja mal wieder eine äußerst aussagekräftige Fehlermeldung :wall:
Was genau bedeutet "bring ich den Code nicht zum Laufen". Der Code ist feherlfrei & wird bei mir zigfach eingesetzt.

Davon abgesehen ist die Frage falsch gestellt, die eigentlich lauten sollte: Wie zeige ich ein DB-Blob in einem TImage an? Denn in diesem TImage kannst du nichts wirklich speichern, sondern nur was anzeigen. Bei Programmende ist das, was in dieser Komponente angezeigt wurde, wieder weg. Gespeichert wird auf einen Datenträger bzw. in eine Datenbank.

LingNeu 13. Sep 2014 06:25

AW: Wie speichere ich ein DB-Blob in ein TImage
 
hallo zusammen,
vielen dank erstmal für eure Hinweise und die Infos.
Die Antwort hat etwas gedauert, da ich unterwegs war.
Meine Lösung sieht jetzt so aus. Ich speichere das Bild auf die Platte - ist ein Jpg. Später hole ich mir das Bild dann mit LoadFromFile. Fertig.
Da ich momentan auch nicht die Zeit habe, hier zu experimentieren ist diese Lösung ok.
Es grüßt euch
LingNeu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz