Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Blob per Stream aus DB lesen und in Imageview anzeigen (https://www.delphipraxis.net/117340-blob-per-stream-aus-db-lesen-und-imageview-anzeigen.html)

Echtet 16. Jul 2008 09:58

Datenbank: Firebird • Version: 2 • Zugriff über: IBX

Blob per Stream aus DB lesen und in Imageview anzeigen
 
Hallo,

Ich möchte aus einem DB-Feld (Firebird) mittels Stream ein Bild (JPG) auslesen, um es in einer Komponente ImageView32 (Graphics32) anzeigen zu lassen.
Bisher bin folgenden Weg gegangen, der auch funktionierte:
Bild aus DB exportieren (SaveToFile), anschließend wieder in Image importieren (LoadFromFile).
Ich möchte aber nun nicht mehr den Umweg über einen Dateiexport/-Import gehen, sondern mit Streams arbeiten.

nach Recherche im Forum habe ich folgenden Lösungsansatz gefunden:

Delphi-Quellcode:
procedure TfrmZoom.FormShow(Sender: TObject);
var
s: TMemoryStream;
begin
    Screen.Cursor := crHourGlass;
    s := TMemoryStream.Create;
    TBlobField(DataModule1.DataSourceZugangsdaten.DataSet.FieldByName('SCREENSHOT')).SaveToStream(s);
    s.Position := 0;
    ImageView32.Bitmap.LoadFromStream(s);    
    s.Free;
    Screen.Cursor := crDefault;
end;
In der Zeile "ImageView32.Bitmap.LoadFromStream(s);" erhalte ich folgende Exception:
... EInvalidGraphic ... Bitmapimage is not valid ...

Muss ich dem Stream sagen, dass er ein JPG-Bild enthält? Oder mache ich einen anderen Fehler?

Mein alter Code (Dateiexport/-Import) lautetet folgendermaßen:
Delphi-Quellcode:
procedure TfrmZoom.FormShow(Sender: TObject);
begin
    Screen.Cursor := crHourGlass;
    TBlobField(DataModule1.DataSourceZugangsdaten.DataSet.FieldByName('SCREENSHOT')).SaveToFile(AktuellerProgrammPfad + 'temp.jpg');
    ImageView32.Bitmap.LoadFromFile(AktuellerProgrammPfad +'temp.jpg');
    Screen.Cursor := crDefault;
end;
Danke für eure Antworten.

Gruß
echtet

Berserker 16. Jul 2008 10:08

Re: Blob per Stream aus DB lesen und in Imageview anzeigen
 
Hi.

Hast du die Unit JPEG in den uses drin?

Echtet 16. Jul 2008 10:12

Re: Blob per Stream aus DB lesen und in Imageview anzeigen
 
Hallo Berserker,

ja, die Unit JPEG ist unter USES eingebunden.

Gruß,
Echtet

marabu 16. Jul 2008 11:17

Re: Blob per Stream aus DB lesen und in Imageview anzeigen
 
Hallo Thimo,

du scheinst die Unit JPEG gar nicht zu verwenden. Du musst die JPG-Bilder mit der Komponente TJpegImage laden und kannst sie dann später per Assign an TBitmap32 zuweisen.

Freundliche Grüße

Echtet 16. Jul 2008 12:10

Re: Blob per Stream aus DB lesen und in Imageview anzeigen
 
Hallo marabu,

danke für den entscheidenden Tip!

Jetzt geht es auch. Ich habe den Code nun folgendermaßen umgeschrieben:
Delphi-Quellcode:
procedure TfrmZoom.FormShow(Sender: TObject);
var
s: TMemoryStream;
JPGBild : TJPEGImage;
tempBMP :TBitmap;
begin
    Screen.Cursor := crHourGlass;
    s := TMemoryStream.Create; //StreamObjekt wird erzeugt
    TBlobField(DataModule1.DataSourceZugangsdaten.DataSet.FieldByName('SCREENSHOT')).SaveToStream(s);
    s.Position := 0; //Stream wird auf 0 positioniert
    JPGBild := TJPEGImage.Create; //JPEG wird erzeugt
    tempBMP := TBitmap.Create;    //temporäres Bitmap wird erzeugt
    JPGBild.LoadFromStream(s);    //JPEG lädt den Stream
    tempBMP.Assign(JPGBild);      //Das JPEG-Bild wird dem temp. Bitmap zugewiesen
    ImageView32.Bitmap.Assign(tempBMP);  // das temp. Bitmap wird dem ImageView zugewiesen
    s.Free;
    JPGBild.Free;
    tempBMP.Free;
    Screen.Cursor := crDefault;
end;
Viele Grüße,

Thimo


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 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