Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi png transparent drucken (https://www.delphipraxis.net/172435-png-transparent-drucken.html)

Pfaffe 3. Jan 2013 16:01

png transparent drucken
 
Mit canvas.StretchDraw male ich ein transparentes png, jedoch wird der Hintergrund schwarz dargestellt.
Warum?
Habe bereits alles mögliche ausprobiert. Z.B. TPNGImage.Draw, auch verschiedene andere png's.

Popov 3. Jan 2013 16:20

AW: png transparent drucken
 
Kenne das Problem zwar nicht, aber keine Farbe ist erst einmal Schwarz, da Wert 0 für schwarz steht. Evtl. solltest transparent gegen weiß tauschen oder die Png auf ein weißes Feld legen.

Pfaffe 4. Jan 2013 09:33

AW: png transparent drucken
 
Wie kann ich zur Laufzeit in einem tranparenten png einen weißen Hintergrund einziehen?

schlagzu 4. Jan 2013 09:46

AW: png transparent drucken
 
Die Komponente kann mit transparenten PNGs umgehen: http://sourceforge.net/projects/graphics32/

Tonic1024 4. Jan 2013 09:47

AW: png transparent drucken
 
Ich würds mal so versuchen

Delphi-Quellcode:
  Canvas.Brush.Color:=clWhite;
  Canvas.Rectangle(0, 0, Width, Height);
Gruß,

Toni

Pfaffe 4. Jan 2013 15:37

AW: png transparent drucken
 
Hallo Toni, bei Deinem Vorschlag wird die angegebene Fläche weiß gemalt.
Hallo schlagzu, ich setze Delphi XE ein und das TPNGImage kann mit Alphakanälen umgehen. Da ich selbst bei anderen Projekten Graphic32 einsetze habe ich versucht die GR32 PNG library zu installieren, was mir aber kurzfristig noch nicht gelungen ist.
Wenn ich vor dem StretchDraw ein (ImageLogo1.Picture.Graphic as TPNGImage).RemoveTransparency; setze, dann ist der Hintergrund nicht mehr schwarz, jedoch ist der Vordergrund, also das Bild um welches mir geht, verschmiert.

Volker Z. 5. Jan 2013 00:17

AW: png transparent drucken
 
Hallo,

ich kann mit

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.LoadFromFile ('D:\Program Files (x86)\Embarcadero\RAD Studio\10.0\Images\GlyFX\glyFX\glyFX\Icons\Aero\PNG\256x256\arrow_left_256.png');
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
  Canvas.Draw (0, 0, Image1.Picture.Graphic)
  // oder auch mit StrechDraw
end;
prima ein transparentes PNG auf das Form-Canvas zeichnen. Wo willst Du eigentlich zeichnen?

Gruß

Pfaffe 5. Jan 2013 11:48

AW: png transparent drucken
 
Auf den Drucker (printer.Canvas) will ich das transparente png ausgeben. Die Ausgabe auf den Bildschirm ist kein Problem.

Volker Z. 5. Jan 2013 21:34

AW: png transparent drucken
 
Hallo,

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  b : TBitmap;
begin
  b := TBitmap.Create;
  try
    b.Assign (Image1.Picture.Graphic);

    Printer.BeginDoc;
    Printer.Canvas.Draw (0, 0, b);
    Printer.Canvas.StretchDraw (Rect (80, 0, 180, 100), b)

  finally
    Printer.EndDoc;
    FreeAndNil (b)
  end
end;

// Über den Objektinspektor noch die Eigenschaft Image1.Transparent := True setzen
Klappt bei mir.

Gruß

Pfaffe 5. Jan 2013 23:29

AW: png transparent drucken
 
Hallo Volker,
Deine Lösung funktioniert noch nicht ganz. Berücksichtigt man noch den Tipp von Toni, dann kommt folgende funktionierende Lösung raus:

Delphi-Quellcode:
var
  b: TBitmap;
begin
  Image1.Transparent:= true;
  Image1.Picture.LoadFromFile('TestBild.PNG');
  b:= TBitmap.Create;
  b.Transparent:= false;
  b.Canvas.Brush.Color:= clWhite;
  b.Canvas.Rectangle(0, 0, Image1.Picture.Graphic.Width, Image1.Picture.Graphic.Height);
  try
    b.Assign(Image1.Picture.Graphic);
    printer.BeginDoc;
    Printer.Canvas.Draw(20, 20, b);
    // Printer.Canvas.StretchDraw((Rect(20, 1000, Image1.Picture.Graphic.Width*2, Image1.Picture.Graphic.Height*2), b)
  finally
    FreeAndNil(b);
    printer.EndDoc;
  end;

Volker Z. 6. Jan 2013 00:30

AW: png transparent drucken
 
Hallo,

es tut mir leid aber ich kann es jetzt nicht nachvollziehen warum erst ein Rechteck auf dem Canvas der Bitmap gezeichnet werden soll/muss und dabei Brush.Color clWhite sein sollte.
Delphi-Quellcode:
   b.Transparent:= false;
   b.Canvas.Brush.Color:= clWhite;
   b.Canvas.Rectangle(0, 0, Image1.Picture.Graphic.Width, Image1.Picture.Graphic.Height); // Rectangle zeichnet meines Wissens über die Eigenschaft Pen nicht Brush
Anschließend das Bitmap mittels Assign sowieso "überschrieben" wird.
Delphi-Quellcode:
 b.Assign (Image1.Picture.Graphic);
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   b : TBitmap;
begin
  Image1.Picture.LoadFromFile ('D:\Program Files (x86)\Embarcadero\RAD Studio\10.0\Images\GlyFX\glyFX\glyFX\Icons\Aero\PNG\256x256\arrow_left_256.png');
  b := TBitmap.Create;
  try
    b.Assign (Image1.Picture.Graphic);
    Printer.BeginDoc;
    Printer.Canvas.Draw (20, 20, b);
  finally
    FreeAndNil (b);
    Printer.EndDoc
  end
end;
Funktioniert bei mir tadellos (ich habe die Eigenschaft Transparent der TImage-Komponente über den Objektinpektor auf True gesetzt). An ein Druckertreiberproblem möchte ich jetzt nicht glauben.

Gruß

Pfaffe 6. Jan 2013 09:40

AW: png transparent drucken
 
Heute morgen funktioniert Dein Lösungsvorschlag.
Schon komisch was sich über Nacht so alles ändern kann!

Pfaffe 7. Jan 2013 10:42

AW: png transparent drucken
 
Hallo Volker,

heute morgen ging Deine Routine wieder nicht.
In der Tat hängt es vom Drucker ab. Z.B. funktionert es auf den pdf-Drucker eDocPrintPro 3.17.7, aber nicht auf den pdf-Drucker pdf-Factory 4.

png funktioniert nicht auf allen Druckern:
Delphi-Quellcode:
lPNG:= TPngImage.Create;
lPNG.LoadFromFile(ProgrammOrdner + 'Logo.png');
b:= TBitmap.Create;
try
  b.Assign(lPNG);
  printer.Canvas.StretchDraw(20, 20, 2500, 2500, b);
finally
  FreeAndNil(b);
  FreeAndNil(lPNG);
end;
jpg funktioniert:
Delphi-Quellcode:
lJPG:= TJPEGImage.Create;
lJPG.LoadFromFile(ProgrammOrdner + 'Logo.jpg');
b:= TBitmap.Create;
try
  b.Assign(lJPG);
  printer.Canvas.StretchDraw(20, 20, 2500, 2500, b);
finally
  FreeAndNil(b);
  FreeAndNil(lJPG);
end;
jpg funktioniert:
Delphi-Quellcode:
lJPG:= TJPEGImage.Create;
lJPG.LoadFromFile(ProgrammOrdner + 'Logo.jpg');
try
  printer.Canvas.StretchDraw(20, 20, 2500, 2500, lJPG);
finally
  FreeAndNil(lJPG);
end;


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