Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PNG-Bild aus BLOB-Feld in Image laden (https://www.delphipraxis.net/156928-png-bild-aus-blob-feld-image-laden.html)

scrat1979 20. Dez 2010 19:50

Datenbank: Absolute Database • Version: 6 • Zugriff über: ABS-Komponenten

PNG-Bild aus BLOB-Feld in Image laden
 
Hallo zusammen,

ich versuche gerade ein PNG-Bild, welches in einem BLOB-Feld einer Datenbank liegt, in eine Image-Komponente zu bekommen. Die Image-Komponente kann auch PNG darstellen, das Laden eines PNG-Bildes mittels OI funktioniert jedenfalls problemlos. Speichere ich das Bild
in einem FileStream und speicher es, dann kann ich es auch problemlos öffnen, also am Zugriff auf die DB oder an einem "korrupten" Header scheint es nicht zu liegen. Nach dem Aufrufen der Funktion erhalte ich eine Zugriffsverletzung...

Delphi-Quellcode:
var
  BlobStream: TStream;
  aq : tabsquery;
begin
      aq := tabsquery.Create(nil);
      aq.DatabaseName := 'xyz';
      aq.SQL.Add('SELECT bild FROM tbltest WHERE id = 1');
      aq.Open;
      BlobStream := aq.CreateBlobStream(aq.FieldByName('bild'),bmRead);
      ImageAnswer.Picture.Graphic.LoadFromStream(BlobStream); // liegt auf der Form!!!
      BlobStream.Free;
      aq.Close;
      aq.Free;
end;
Kann sich jemand vorstellen, warum das nicht funktioniert???

Danke im Voraus,
Michael

mkinzler 20. Dez 2010 19:54

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Besser:
Delphi-Quellcode:
aq.SQL.Text := 'SELECT bild FROM tbltest WHERE id = 1';
In welcher Zeile kommt die Zugriffsverletzung

Bernhard Geyer 20. Dez 2010 20:01

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Du musst das PNG erst in eine temporäre Instanz der PNG-Imagekomponente laden. TPicture kann nur beim laden aus einer Datei über die Dateiextension das Grafikformat erkennen. Beim Stream als Stream müsste hier noch der Klassenname der entsprechenden Grafikkomponente am Anfangen stehen. Einfach mal ein PNG mit der IDE zuweisen und dann die DFM anschauen. Dort steht etwas in der Art: "TPNGImage" vor den eigentlichen PNG-Stream.

scrat1979 21. Dez 2010 08:27

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1069660)
Du musst das PNG erst in eine temporäre Instanz der PNG-Imagekomponente laden. TPicture kann nur beim laden aus einer Datei über die Dateiextension das Grafikformat erkennen. Beim Stream als Stream müsste hier noch der Klassenname der entsprechenden Grafikkomponente am Anfangen stehen. Einfach mal ein PNG mit der IDE zuweisen und dann die DFM anschauen. Dort steht etwas in der Art: "TPNGImage" vor den eigentlichen PNG-Stream.

Hmmmm, dachte, ich hätte das schonmal versucht. ich werde es im laufe des Tages testen und mein Feedback abgeben

@mkinzler: die Zugriffsverletzung kommt beim "..LoadFromStream(...);". wie gesagt, die gleiche Anweisung mit einem TFileStream funktioniert problemlos. Es müsste wohl tatsächlich ein spezifisches Problem mit dem Laden in die TImage-Komponente sein.

Danke schonmal!

scrat1979 21. Dez 2010 15:29

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1069660)
Du musst das PNG erst in eine temporäre Instanz der PNG-Imagekomponente laden. TPicture kann nur beim laden aus einer Datei über die Dateiextension das Grafikformat erkennen. Beim Stream als Stream müsste hier noch der Klassenname der entsprechenden Grafikkomponente am Anfangen stehen. Einfach mal ein PNG mit der IDE zuweisen und dann die DFM anschauen. Dort steht etwas in der Art: "TPNGImage" vor den eigentlichen PNG-Stream.

UPDATE: Funktioniert perfekt! Hatte damals vergessen, die Unit "PNGImage" einzubinden!! Danke!

Deep-Sea 21. Dez 2010 15:33

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Tipp: Nutze doch bitte try-finally-Blöcke:
Delphi-Quellcode:
aq := tabsquery.Create(nil);
try
  // Tue etwas mit aq
finally
  aq.Free;
end;
:thumb:

scrat1979 21. Dez 2010 16:45

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Zitat:

Zitat von Deep-Sea (Beitrag 1069802)
Tipp: Nutze doch bitte try-finally-Blöcke:
Delphi-Quellcode:
aq := tabsquery.Create(nil);
try
  // Tue etwas mit aq
finally
  aq.Free;
end;
:thumb:

Schon klar :-) Wollte aber nur den wesentlichen Code posten. Trotzdem Danke für den Hinweis, Deep-Sea!!!

Laaeris 2. Sep 2020 10:14

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Zitat:

Zitat von scrat1979 (Beitrag 1069801)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1069660)
Du musst das PNG erst in eine temporäre Instanz der PNG-Imagekomponente laden. TPicture kann nur beim laden aus einer Datei über die Dateiextension das Grafikformat erkennen. Beim Stream als Stream müsste hier noch der Klassenname der entsprechenden Grafikkomponente am Anfangen stehen. Einfach mal ein PNG mit der IDE zuweisen und dann die DFM anschauen. Dort steht etwas in der Art: "TPNGImage" vor den eigentlichen PNG-Stream.

UPDATE: Funktioniert perfekt! Hatte damals vergessen, die Unit "PNGImage" einzubinden!! Danke!

Ich habe sicher nicht genug Erfahrung, jedenfalls verstehe ich nicht, wie Dein endgültiger Ladecode nun aussieht:roll:. Kannst Du ihn vielleicht einmal posten?
Speicherst Du PNG auch im Blobfeld und ist der Code, wenn ja, "äquivalent"?

Liebe Grüße,

David

joachimd 3. Sep 2020 08:31

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Delphi-Quellcode:
var png: TPngImage;

...
  png := TPngImage.Create;
  png.LoadFromStream(BlobStream);
  Picture.Graphic.Assign(png);
...

himitsu 3. Sep 2020 09:48

AW: PNG-Bild aus BLOB-Feld in Image laden
 
Alte Delphis schauten immer nur auf die Dateiendung, also nur im Picture.LoadFromFile,
aber seit einer Weile ist im Picture.LoadFromStream ein Code drin, der auf die MagicBytes (FileHeader) guckt.

Drum geht es jetzt auch direkt mit
Delphi-Quellcode:
Image.Picture.LoadFromStream(BlobStream);
,
ohne dass man vorher selber im Image.Picture.Graphic den "richtigen" Typ bereitstellen muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Seite 1 von 2  1 2      

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