Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   GDI+: Regions im gespeicherten File nicht vorhanden (https://www.delphipraxis.net/161256-gdi-regions-im-gespeicherten-file-nicht-vorhanden.html)

Jazzman_Marburg 24. Jun 2011 13:00

GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo Gemeinde!
Ich nutze (eigentlich mit Begeisterung) die GDI+ von Erik. Nun ereilt mich aber ein Problem mit Bitmap.Save('Output.png', TGPImageFormat.Png): Die zuvor eingerichteten Regions werden beim sichern nicht berücksichtigt!
Ich habe also Regions (vom Typ IGPRegion) eingerichtet, und mit Region.Exclude(myPaths) diesen Bereich der Bitmap (IGPBitmap) für Veränderungen (Farbe, Helligkeit etc.) gesperrt. Wenn ich nun mit Bitmap.ApplyEffect(myEffect) die Bitmap verändere, sehe ich auf dem Monitor nach
Delphi-Quellcode:
    Graphics.Clip := Region;            // Clipping-Region setzen
    Graphics.DrawImage(Bitmap, 0, 0, Bitmap.Width, Bitmap.Height);
dass die Regions von den Änderungen ausgenommen sind. Prima. Wenn ich nun genau dieses Bitmap speichere, ist im File sehr wohl alles geändert. D.h. die Regions wurden nicht berücksichtigt.

Jemand eine Idee, weshalb auf dem Monitor alles gut ist, aber beim speichern die Regions futsch gehen?

Bin für jeden Hinweis dankbar!

Gruß
Jazzman

xaromz 24. Jun 2011 13:09

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo,

zeig mal etwas mehr Code, ich habe da eine Vermutung, aber ohne mehr Infos ist das eher ein Raten.

Gruß
xaromz

Jazzman_Marburg 24. Jun 2011 13:30

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo!
Super, dass Du es Dir näher anschauen möchtest.
Ich hoffe Du steigst durch:
Delphi-Quellcode:
VAR
  Bitmap  : IGPBitmap;
  Graphics : IGPGraphics;
  myPaths : IGPGraphicsPath;
  Region  : IGPRegion;
...

  Bitmap  := TGPBitmap.Create(Filename);
  Graphics := TGPGraphics.Create(Main_Form.MainImage.Canvas.Handle);
  myPaths := XML2Path(aXMLDoc); // bastelt aus XML-Document paths
  Region  := TGPRegion.Create;
  Region.Exclude(myPaths);      // Clipping-Region aus den Paths

  Bitmap.ApplyEffect(HSL_GDIp); // irgendein Farb-Effekt applizieren

  Graphics.Clip := Region;            // Clipping-Region setzen
  Graphics.DrawImage(Bitmap, 0, 0, Bitmap.Width, Bitmap.Height);
  Main_Form.MainImage.Refresh;  // hier ist noch alles ok: Regions nicht eingefärbt
...

  Bitmap.Save(SaveImage.Dialog.FileName, TGPImageFormat.PNG); // im png-File ist alles eingefärbt
Also nach "Graphics.DrawImage(Bitmap, ...);" sieht alles super aus: Die ausgestanzten Regions sind nicht eingefärbt. Aber im File danach ist es so, als ob ich mit Regions nie was gemacht hätte -- der ApplyEffect ist auf alles appliziert worden.

Vielen Dank
Gruß
Jazzman

xaromz 24. Jun 2011 14:22

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo,

mein Verdacht bestätigt sich:
Du wendest die Clippingregion zum Zeichnen auf Deinem Form an, aber nicht auf Dein Bitmap.

Gruß
xaromz

Jazzman_Marburg 24. Jun 2011 14:54

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
:shock: Magst Du das ein wenig erläutern?

Oder: Wie wende ich denn den Clipping-Bereich auf mein Bitmap an?

Danke!

Jazzman

xaromz 24. Jun 2011 16:54

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo,

momentan wendest Du Deinen Farbeffekt auf das gesamte Bitmap an und zeichnest dann das Bitmap auf Graphic (Deinen Wrapper für ein TImage oder ähnliches). Erst bei diesem Zeichenvorgang verwendest Du Clipping, deshalb siehst Du auch nur den geclippten Ausschnitt von Deinem Bitmap, obwohl sich der Farbeffekt auf das gesamte Bitmap bezieht.

Nun zur Lösung:
Falls die Effekte Regions beachten, musst Du die Clippingregion auf Dein Bitmap anwenden, bevor Du den Effekt anwendest.
Falls das nicht funktioniert bleibt Dir nur die Möglichkeit, mit einem Hilfsbitmap zu arbeiten: Die klonst Dein Bitmap, wendest dann den Effekt beim geklonten Bitmap an, weist dann Deinem Bitmap die Clippingregion zu und malst das Hilfsbitmap auf Dein Original.

Gruß
xaromz

Jazzman_Marburg 24. Jun 2011 17:23

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo!
Vielen Dank für Deine Antwort!
Aber -- und ich vermute ich stehe auf dem Schlauch -- beide Lösungswege laufen auf ein- und den selben Punkt hinaus (Hervorhebung von mir):

Zitat:

Zitat von xaromz (Beitrag 1108156)
Nun zur Lösung:
Falls die Effekte Regions beachten, musst Du die Clippingregion auf Dein Bitmap anwenden, bevor Du den Effekt anwendest.
Falls das nicht funktioniert bleibt Dir nur die Möglichkeit, mit einem Hilfsbitmap zu arbeiten: Die klonst Dein Bitmap, wendest dann den Effekt beim geklonten Bitmap an, weist dann Deinem Bitmap die Clippingregion zu und malst das Hilfsbitmap auf Dein Original.
xaromz

"Weise Deinem Bitmap den Clipping-Bereich zu" -- und ich frage eben: "Wie weise ich dem Bitmap einen Clipping-Bereich zu?

Kannst Du mein Problem verstehen? Egal wie ich es drehe oder wende, es läuft darauf hinaus dem Bitmap einen Clipping-Bereich zuzuweisen -- und ich verstehe nicht wie.

Deine Analyse scheint mir ganz korrekt zu: Die Farbeffekte weise ich dem kompletten Bitmap zu, das Clipping hingegen nur beim Zeichnen. Aber ich verstehe nicht, wie ich das Clipping vorher dem gesamten Bitmap zuweisen soll. Das Bitmap-Objekt hat kein "Clip" oder "Region" im Gegensatz zum Graphic-Objekt.

(Das ist keine Störrigkeit, ich verstehe nur nicht, wie ich es tun sollte).

Lieben Dank
Gruß
Jazzman

xaromz 24. Jun 2011 18:13

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Hallo,

sowas habe ich mir schon gedacht, deshalb habe ich die zweite Lösung mit aufgenommen. Um ein Bitmap bearbeiten zu können, musst Du Dir ein Graphic-Objekt holen. Diesem kannst Du dann das Clippingobjekt zuweisen. Hier mal aus dem Kopf:
Delphi-Quellcode:
VAR
   Bitmap : IGPBitmap;
   HelpBitmap: IGPBitmap;
   Graphics : IGPGraphics;
   myPaths : IGPGraphicsPath;
   Region : IGPRegion;
 ...

   Bitmap := TGPBitmap.Create(Filename);
   HelpBitmap = Bitmap.Clone(); // Hilfsbitmap erzeugen (ich hoffe, es gibt die Methode Clone)
   HelpBitmap.ApplyEffect(HSL_GDIp); // irgendein Farb-Effekt applizieren
   Graphics = TGPGraphics.Create(Bitmap); // Graphic erzeugen
   
   myPaths := XML2Path(aXMLDoc); // bastelt aus XML-Document paths
   Region := TGPRegion.Create;
   Region.Exclude(myPaths); // Clipping-Region aus den Paths
   Graphics.Clip := Region; // Clipping-Region setzen

   Graphics.DrawImage(HelpBitmap, 0, 0, Bitmap.Width, Bitmap.Height); //Hilfsbitmap malen
Gruß
xaromz

Jazzman_Marburg 25. Jun 2011 11:59

AW: GDI+: Regions im gespeicherten File nicht vorhanden
 
Super, vielen Dank! :-D

Das sieht nach einer guten Lösung aus -- werde es ausprobieren.

Lieben Danke & Gruß
Jazzman


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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