![]() |
TPNGImage in TGPImage umwandeln
Hallo,
ich möchte ein TPNGImage in ein TGPImage (GDI+ Library, ![]() Mein bisheriger Ansatz sieht so aus: 1. PNG laden 2. PNG in TMemoryStream speichern 3. TGPImage aus diesem Stream erzeugen. (4. Bild zeichnen) Folgender Code wirft allerdings eine EInvalidPointer Exception:
Delphi-Quellcode:
Dem Stacktrace zufolge sieht es so aus, als würde das Destroy vom StreamAdapter den Fehler verursachen. Was genau mache ich falsch?
procedure TForm2.btn11Click(Sender: TObject);
var PNGImage: TPNGImage; ImageStream: TMemoryStream; Image: IGPImage; G: IGPGraphics; begin // PNG erstellen & laden PNGImage := TPNGImage.Create; PNGImage.LoadFromFile('[Dateipfad]'); ImageStream := TMemoryStream.Create; // PNG in Stream speichern PNGImage.SaveToStream(ImageStream); // TGPImage von Stream erzeugen Image := TGPImage.FromStream(TStreamAdapter.Create(ImageStream)); // TGPImage zeichnen G := TGPGraphics.Create(pbButtonTest.Canvas.Handle); G.DrawImage(Image, 0, 0); end; Grüße Simon |
AW: TPNGImage in TGPImage umwandeln
Funktioniert dieses eventuell so?
Delphi-Quellcode:
procedure TForm2.btn11Click(Sender: TObject);
var PNGImage: TPNGImage; Image: IGPImage; begin PNGImage := TPNGImage.Create; PNGImage.LoadFromFile('[Dateipfad]'); Image := IGPImage.Create; Image.Picture.Bitmap.Assign(PNGImage); ... |
AW: TPNGImage in TGPImage umwandeln
Hi Stephan,
danke für deine Antwort! Leider funktioniert es so nicht. Schon am
Delphi-Quellcode:
scheitert es mit E2018 "Record, Objekt oder Klassentyp erforderlich", weil IGPImage ein Interface ist.
Image := IGPImage.Create
Ich verwende übrigens diese Library: ![]() Eigentlich sollte sich TGPImage selbst um den Stream kümmern, der ihm im Konstruktor übergeben wird, oder?! Meine Versuche den TStreamAdapter aus dem Konstruktor auszulagern und selbst Free aufzurufen, nachdem das Image nicht mehr benötigt wird, scheitern mit einer AccessViolation. Ich bin etwas ratlos, auch weil ich mit Interfaces bisher eher wenig zu tun hatte. Vielleicht liegt der Fehler ja auch in der Library selbst, aber bei 17.000 Zeilen Fremdcode muss ich leider kapitulieren. Deswegen hatte ich gehofft, dass ich einfach etwas Simples übersehen habe. Grüße Simon |
AW: TPNGImage in TGPImage umwandeln
Der IStream-Parameter von FromStream ist als
Delphi-Quellcode:
deklariert. Das setzt die Referenzzählung außer Kraft. Eine lokale IStream-Variable schafft hier Abhilfe.
const
Delphi-Quellcode:
stream := TStreamAdapter.Create(ImageStream);
// TGPImage von Stream erzeugen Image := TGPImage.FromStream(stream); |
AW: TPNGImage in TGPImage umwandeln
Vielen, vielen Dank Uwe, es funktioniert!
Ahh, den halben Tag habe ich daran gesessen und die Lösung ist ein Einzeiler... Ich werde mir wohl mal etwas Literatur zum Thema Referenzzählung zu Gemüte führen. :-D Euch noch einen schönen Abend! |
AW: TPNGImage in TGPImage umwandeln
Zitat:
Und das es machbar ist wird zb mit Strings bewiesen. Es mag ein definiertes Verhalten sein aber das macht es nicht richtig. Versuche das mal einem Neuling beizubringen.... (Ps: Uwe , ich denke das Problem ist Dir sehr wohl bekannt, ich habe vor Jahren mit Barry Kelly darüber gesprochen, Aussage : "They dont want it") |
AW: TPNGImage in TGPImage umwandeln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 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