AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TPNGImage in TGPImage umwandeln

Ein Thema von SiLo0815 · begonnen am 7. Mär 2017 · letzter Beitrag vom 8. Mär 2017
Antwort Antwort
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#1

TPNGImage in TGPImage umwandeln

  Alt 7. Mär 2017, 17:05
Hallo,

ich möchte ein TPNGImage in ein TGPImage (GDI+ Library, http://www.bilsen.com/gdiplus/index.shtml) umwandeln.
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:
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;
Dem Stacktrace zufolge sieht es so aus, als würde das Destroy vom StreamAdapter den Fehler verursachen. Was genau mache ich falsch?

Grüße
Simon
Simon

Geändert von SiLo0815 ( 7. Mär 2017 um 20:37 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: TPNGImage in TGPImage umwandeln

  Alt 7. Mär 2017, 20:04
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);
   ...
  Mit Zitat antworten Zitat
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: TPNGImage in TGPImage umwandeln

  Alt 7. Mär 2017, 20:36
Hi Stephan,

danke für deine Antwort!

Leider funktioniert es so nicht. Schon am Image := IGPImage.Create scheitert es mit E2018 "Record, Objekt oder Klassentyp erforderlich", weil IGPImage ein Interface ist.
Ich verwende übrigens diese Library: http://www.bilsen.com/gdiplus/index.shtml (das hätte ich vielleicht im Anfangspost schon erwähnen sollen, sorry. )

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
Simon
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: TPNGImage in TGPImage umwandeln

  Alt 7. Mär 2017, 21:07
Der IStream-Parameter von FromStream ist als const deklariert. Das setzt die Referenzzählung außer Kraft. Eine lokale IStream-Variable schafft hier Abhilfe.

Delphi-Quellcode:
       stream := TStreamAdapter.Create(ImageStream);

       // TGPImage von Stream erzeugen
       Image := TGPImage.FromStream(stream);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SiLo0815

Registriert seit: 23. Feb 2017
Ort: Essen, NRW
7 Beiträge
 
Delphi XE5 Enterprise
 
#5

AW: TPNGImage in TGPImage umwandeln

  Alt 7. Mär 2017, 21:25
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.

Euch noch einen schönen Abend!
Simon
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TPNGImage in TGPImage umwandeln

  Alt 7. Mär 2017, 23:31
Der IStream-Parameter von FromStream ist als const deklariert. Das setzt die Referenzzählung außer Kraft. Eine lokale IStream-Variable schafft hier Abhilfe.

Delphi-Quellcode:
       stream := TStreamAdapter.Create(ImageStream);

       // TGPImage von Stream erzeugen
       Image := TGPImage.FromStream(stream);
Das ist ein Problem das schon wirklich oft aufgetreten ist, aber Embarcadero ignoriert das seit ewig. Bei anderen Managed Types funktioniert es bei interfaces nicht. Das könnte der compiler beheben.....
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")
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: TPNGImage in TGPImage umwandeln

  Alt 8. Mär 2017, 00:14
Es mag ein definiertes Verhalten sein aber das macht es nicht richtig.
Ich bin auch kein Freund dieser Eigenart, aber ich weiß, daß dieses Feature manchmal benutzt wird, um die Referenzzählung bei Interface-Parametern zu umgehen. Eine Änderung würde da wohl eher verhalten begrüßt werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 21: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