![]() |
Image from Stream laden?
Hi,
ich muss ein Bild von nem Stream laden, aber wie es scheint kann das die TImage Komponente nicht. Wie kann ich dann verschiedene Bildformate in eine Bild-Komponente laden? Hier mein Code:
Delphi-Quellcode:
Danke für eure Hilfe!
var ms: TMemoryStream;
pic: TImage; begin // Picturs laden ms := TMemoryStream.Create; ms := tb.FieldAsBlob(tb.FieldIndex['picture']); ms.Position := 0; pic := TImage.Create(Self); pic.LoadFromStream(ms); // <--- hier schlägt es zu.... Self.DetailsMediaImage.Picture.Graphic := pic; // <--- hier eventuell auch |
AW: Image from Stream laden?
Ein Stream ist einfach nur ein Haufen von Bytes. Es gibt dort keine Information, wie diese zu interpretieren sind. Du musst dir also irgendwie noch merken, was dieser Stream darstellen soll.
Ja ein Bild, aber was für eins. JPEG, GIF, Bitmap ... Dann erzeuge dir das passende Objekt (TJpegImage, ...) dazu und lade den Stream in dieses Objekt. Dieses Objekt kannst du dann per Assign an das Image übergeben und das Bild wird angezeigt. TImage ist nur ein Container und zeigt das an, was du reinsteckst. |
AW: Image from Stream laden?
Ich hatte für diesen Zweck einmal eine Unit hier hochgeladen:
![]() |
AW: Image from Stream laden?
Wobei viele Dateitypen einen Dateiheader haben. Gif-Dateien, als einfaches Beispiel, fangen z.B. als Text dargestellt immer mit „GIF89a“ an. Es gibt im Internet auch Datenbanken dazu...
Oder man versucht einfach in einer Schleife alle möglichen Formate per brute-force durch, bis eins passt. Ist vielleicht ein kleinwenig unsauber, aber das einfachste. Beispiel:
Delphi-Quellcode:
Wobei ich gerade noch mal nachgeschaut habe, und laut Online-Hilfe
const
FORMATS: array [0..3] of TGraphicClass = (TBitmap, TJpegImage, TGifImage, TPngObject); // z.B. var Stream: TMemoryStream; i: integer; Graphic: TGraphic; begin Stream := tb.FieldAsBlob(tb.FieldIndex['picture']); try Graphic := nil; // Alle Formate durchprobieren for i := low(FORMATS) to high(FORMATS) do begin Stream.Position := 0; Graphic := FORMATS[i].Create; try Graphic.LoadFromStream(Stream); // Laden hat geklappt -> raus aus der schleife break; finally FreeAndNil(Graphic) end; end; if not Assigned(Graphic) then raise EInvalidGraphic.Create('Nicht unterstütztes Format'); DetailsMediaImage.Picture.Graphic.Assign(Graphic); Graphic.Free; finally Stream.Free; end; end; ![]() Also reicht:
Delphi-Quellcode:
EDIT: Das ist übrigens Blödsinn mit
var ms: TMemoryStream;
begin ms := tb.FieldAsBlob(tb.FieldIndex['picture']); ms.Position := 0; DetailsMediaImage.Picture.LoadFromStream(ms);
Delphi-Quellcode:
Da wird zwei mal ein Stream erzeugt, aber nur einmal freigegeben! (Ich hoffe zumindest, du gibst ihn frei...)
ms := TMemoryStream.Create;
ms := tb.FieldAsBlob(tb.FieldIndex['picture']); |
AW: Image from Stream laden?
Zitat:
|
AW: Image from Stream laden?
Create rufst du zwar nur einmal explizit auf, aber anschließend überschreibst du ja die Variable mit einer Referenz auf eine neue Instanz (die von FieldAsBlob zurückgegeben wird). Folglich wird beim Aufruf von Free am Ende nur eine von zwei Instanzen freigegeben.
TGraphic (wie auch TPicture) ist in der Unit Graphics deklariert, die eigentlich standardmäßig eingebunden ist, wenn man ein neues Formular anlegt. |
AW: Image from Stream laden?
Hm... so muss es richtig sein, nur schlägt es irgendwie fehl...
Delphi-Quellcode:
// Picture zeigen
if tb.FieldAsBlob(tb.FieldIndex['picture']) <> nil then begin ms := TMemoryStream.Create; pic := TJPEGImage.Create; try ms := tb.FieldAsBlob(tb.FieldIndex['picture']); ms.Position := 0; pic.LoadFromStream(ms); Self.DetailsMediaImage.Picture.Graphic := pic; finally ms.Free; // <--- schlägt fehl pic.Free; // hier auch end; end else DetailsMediaImage.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'books.jpg'); |
AW: Image from Stream laden?
Was heißt „schlägt fehl“? Fehlermeldung? Wenn ja, welche?
Ich hab noch mal ein bisschen gegoogelt und Quellcode von einer Methode namens FieldAsBlob gefunden. Ich weiß nicht, ob es sich um die gleiche Methode handelt, um die es bei dir geht, da du nicht verraten hast, zu welcher Klasse/Bibliothek das gehört. Jedenfalls ist es bei der Implementierung, die ich gefunden habe, offenbar – anders als ich dachte – so, dass da keine neue Instanz erzeugt wird sondern eine bereits angelegte zurückgeliefert wird, die von der Besitzer-Klasse automatisch später freigegeben wird. Also darf Free nicht aufgerufen werden.
Delphi-Quellcode:
if tb.FieldAsBlob(tb.FieldIndex['picture']) <> nil then
begin // ms := TMemoryStream.Create; NEIN! Speicherleck! ms := tb.FieldAsBlob(tb.FieldIndex['picture']); ms.Position := 0; DetailsMediaImage.Picture.LoadFromStream(ms); end else DetailsMediaImage.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'books.jpg'); |
AW: Image from Stream laden?
Zitat:
|
AW: Image from Stream laden?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz