Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Leeres TPNGImage erzeugen (https://www.delphipraxis.net/170673-leeres-tpngimage-erzeugen.html)

Tonic1024 28. Sep 2012 09:16

Leeres TPNGImage erzeugen
 
Irgendwie hab ich so meine Probleme ein leeres, transparentes TPNGImage zu erzeugen in dem ich dann zeichnen kann.

Ich erhalte zwar ein leeres, transparentes Image in den richtigen Abmessungen aber der Rest schlägt fehl. Lade ich ein vorhandenes Bild von der Platte wird meine Linie darauf angezeigt.

Hier mal mein Versuchsaufbau.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Img: TPNGImage;
    Bild: TPngImage;
begin
  Bild:=TPNGImage.Create;
  Bild.LoadFromFile('c:\dings\box.png');

  Img:=TPNGImage.Create;
  Img.CreateBlank(Bild.Header.ColorType, Bild.Header.BitDepth, Bild.Width , Bild.Height);
  Img.CreateAlpha;

//  Img.Assign(Bild);  // Dann funktionierts. Das will ich aber nicht.

  // irgendwas mit Img machen
  Img.Canvas.CopyMode:= cmSrcCopy;
  Img.Canvas.Draw(0, 0, Bild);  
  Img.Draw(Bild.Canvas, Rect(0, 0, Bild.Width, Bild.Height));

  Img.Canvas.Pen.Color:=clBlack;
  Img.Canvas.MoveTo(0, 0);
  Img.Canvas.LineTo(50, 50);

  Self.Canvas.Draw(20, 20, Img); // Ausgabe auf dem Form...
  Img.SaveToFile('c:\dings\box2.png'); // ... und zur Kontrolle speichern - beides leer
end;
Wo ist mein Fehler?

Toni

Bummi 28. Sep 2012 09:51

AW: Leeres TPNGImage erzeugen
 
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);

var Img: TPNGImage;
    Bild: TPngImage;
    i:Integer;
begin
  Bild:=TPNGImage.Create;
  Bild.LoadFromFile('C:\Icons\IconCollection\ix_ap_all\128x128\shadow\add.png');

  Img:=TPNGImage.CreateBlank(COLOR_RGBAlpha, 8, Bild.Width , Bild.Height);
  Img.CreateAlpha;

   BitBlt (Img.Canvas.Handle, 0 , 0 , Bild.Width, Bild.Height, Bild.Canvas.Handle, 0, 0, SRCCOPY);
   For I := 0  To Bild.Width -  1  Do
      CopyMemory (Img.AlphaScanline [i], pByte (dword (Bild.AlphaScanline [i])), Bild.Width);



  Img.Canvas.Pen.Color:=clLime;
  Img.Canvas.MoveTo(0, 0);
  Img.Canvas.LineTo(50, 50);
  Canvas.Draw(20, 20, IMG); // Ausgabe auf dem Form...
end;
Ein Problem ist die Beschränkung des TCanvas bezüglich des Alphakanals, Du siehst die gemalten Linien nur wo Alpha>0, hier könnte GDI+ helfen, welches mit Alphakanälen umgehen kann.

Tonic1024 28. Sep 2012 10:13

AW: Leeres TPNGImage erzeugen
 
Vielen Dank für deine rasendschnelle Antwort.

Dein Beispiel führt zwar zu dem selben Ergebnis wie Assign, was ich ja nicht wollte, aber ein leeres PNGImage hab ich immer noch nicht. Muss ich mich denn ganz von der Idee verabschieden in ein PNG hineinzeichen, Bitmaps ausschneiden und hinein zu kopieren?

Sollte ich wenn ich Transparenz und Semitransparenz brauche vielleicht lieber mit TBitmap32 auseinander setzen? Oder hab ich dort wieder die selben Probleme? Oder ist GDI+ der einzige Weg? Hab damit schon mal experimentiert aber es ist mir eigentlich zu komplex für meine Mini-Aufgabe.

Toni


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