AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Blob per Stream aus DB lesen und in Imageview anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

Blob per Stream aus DB lesen und in Imageview anzeigen

Ein Thema von Echtet · begonnen am 16. Jul 2008 · letzter Beitrag vom 16. Jul 2008
Antwort Antwort
Echtet

Registriert seit: 5. Jan 2004
Ort: Dortmund
21 Beiträge
 
Delphi XE3 Professional
 
#1

Blob per Stream aus DB lesen und in Imageview anzeigen

  Alt 16. Jul 2008, 09:58
Datenbank: Firebird • Version: 2 • Zugriff über: IBX
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
Thimo Echtermann
  Mit Zitat antworten Zitat
Benutzerbild von Berserker
Berserker

Registriert seit: 15. Dez 2002
Ort: Chemnitz
164 Beiträge
 
Delphi 6 Professional
 
#2

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

  Alt 16. Jul 2008, 10:08
Hi.

Hast du die Unit JPEG in den uses drin?
  Mit Zitat antworten Zitat
Echtet

Registriert seit: 5. Jan 2004
Ort: Dortmund
21 Beiträge
 
Delphi XE3 Professional
 
#3

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

  Alt 16. Jul 2008, 10:12
Hallo Berserker,

ja, die Unit JPEG ist unter USES eingebunden.

Gruß,
Echtet
Thimo Echtermann
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

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

  Alt 16. Jul 2008, 11:17
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
  Mit Zitat antworten Zitat
Echtet

Registriert seit: 5. Jan 2004
Ort: Dortmund
21 Beiträge
 
Delphi XE3 Professional
 
#5

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

  Alt 16. Jul 2008, 12:10
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
Thimo Echtermann
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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