Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Auf Canvas zeichnen, wenn PNG (https://www.delphipraxis.net/160327-auf-canvas-zeichnen-wenn-png.html)

Jazzman_Marburg 8. Mai 2011 14:24

Auf Canvas zeichnen, wenn PNG
 
Hallo Gemeinde,
ich habe mit (Delphi XE) myImage.Picture.LoadFromFile('Grafik.PNG') ein PNG-File geladen und versuche nun auf das gleiche Canvas ein myImage.Canvas.Rectangle(myRect) aber da bekomme ich einen Fehler:
EInvalidOpeartion: Ein Bild kann nur geändert werden, wenn es ein Bitmap enthält.

Klar ein PNG ist kein Bitmap, aber kann ich dann garnicht auf das Canvas zeichnen?
Muß das Ding irgendwie konvertiert werden (das veränderte PNG würde ich aber anschließend wieder gern als PNG speichern)?

Die Delphi-Hilfe sagt folgendes zu TPngImage:
Delphi-Quellcode:
procedure Draw(ACanvas: TCanvas; const Rect: TRect);
Draws the png image on a canvas.

Call Draw to draw the png image on a canvas. Draw considers transparency options when drawing the image, but ignores pixel information.
Aber ich verstehe den Hinweis auf TPngImage nicht -- Auf der Form habe ich ja nur das TImage, und dort habe ich das PNG-File mit LoadFromFile geladen.

Hat jemand wohl eine Idee, wie aich auf das Canvas des TImage malen kann, wenn es zuvor ein PNG geladen hat?

Vielen Dank im voraus
Gruß
Jazzman

Thom 8. Mai 2011 14:36

AW: Auf Canvas zeichnen, wenn PNG
 
TPNGImage(Image.Picure.Graphic).Canvas.xxx :gruebel:

Namenloser 8. Mai 2011 14:48

AW: Auf Canvas zeichnen, wenn PNG
 
Du musst das PNG erst auf ein Bitmap kopieren, zum Speichern umgekehrt:
Delphi-Quellcode:
var
  Bmp: TBitmap;
  Png: TPNGObject;
begin
  Bmp := nil;
  Png := nil;
  try
    Bmp := TBitmap.Create;
    Bmp.Assign(myImage.Picture.Graphic);
    Bmp.Canvas.…(…);

    Png := TPNGObject.Create;
    Png.Assign(Bmp);
    Png.SaveToFile(…);  
  finally
    Bmp.Free;
    Png.Free;
  end;
end;

Jazzman_Marburg 8. Mai 2011 14:56

AW: Auf Canvas zeichnen, wenn PNG
 
Zitat:

Zitat von Thom (Beitrag 1099555)
TPNGImage(Image.Picure.Graphic).Canvas.xxx :gruebel:

Der gleiche Fehler.

Jazzman

Jazzman_Marburg 8. Mai 2011 14:57

AW: Auf Canvas zeichnen, wenn PNG
 
Zitat:

Zitat von NamenLozer (Beitrag 1099557)
Du musst das PNG erst auf ein Bitmap kopieren, zum Speichern umgekehrt:
Delphi-Quellcode:
var
  Bmp: TBitmap;
  Png: TPNGObject;
begin
  Bmp := nil;
  Png := nil;
  try
    Bmp := TBitmap.Create;
    Bmp.Assign(myImage.Picture.Graphic);
    Bmp.Canvas.…(…);

    Png := TPNGImage.Create;
    Png.Assign(Bmp);
    Png.SaveToFile(…);  
  finally
    Bmp.Free;
    Png.Free;
  end;
end;

Super - vielen Dank!

Jazzman

Thom 8. Mai 2011 15:13

AW: Auf Canvas zeichnen, wenn PNG
 
Zitat:

Zitat von NamenLozer (Beitrag 1099557)
Du musst das PNG erst auf ein Bitmap kopieren, zum Speichern umgekehrt...

Das ist nicht korrekt.
Folgendes Beispiel funktioniert ohne Probleme:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.LoadFromFile('xxx.png');
  with TPNGImage(Image1.Picture.Graphic) do
  begin
    Canvas.Brush.Color:=clRed;
    Canvas.Rectangle(10,10,50,50);
  end;
  Image1.Refresh;
end;
Wer's nicht glaubt: Ich kann die Demo gern anhängen...
Welche PNGImage-Version verwendest Du?

EWeiss 8. Mai 2011 15:21

AW: Auf Canvas zeichnen, wenn PNG
 
Zitat:

Zitat von Thom (Beitrag 1099562)
Zitat:

Zitat von NamenLozer (Beitrag 1099557)
Du musst das PNG erst auf ein Bitmap kopieren, zum Speichern umgekehrt...

Das ist nicht korrekt.
Folgendes Beispiel funktioniert ohne Probleme:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.LoadFromFile('xxx.png');
  with TPNGImage(Image1.Picture.Graphic) do
  begin
    Canvas.Brush.Color:=clRed;
    Canvas.Rectangle(10,10,50,50);
  end;
  Image1.Refresh;
end;
Wer's nicht glaubt: Ich kann die Demo gern anhängen...
Welche PNGImage-Version verwendest Du?

Vor allem sollte man bedenken das bei den konvertieren der Alpha Channel verloren geht.
Oder?

gruss

Thom 8. Mai 2011 15:24

AW: Auf Canvas zeichnen, wenn PNG
 
Genau - das kommt auch noch als "Nebeneffekt" hinzu! :thumb:

EWeiss 8. Mai 2011 15:39

AW: Auf Canvas zeichnen, wenn PNG
 
Zitat:

Zitat von Thom (Beitrag 1099567)
Genau - das kommt auch noch als "Nebeneffekt" hinzu! :thumb:

Und dann macht es keinen Sinn mehr ein PNG einzuladen und darauf zu zeichnen.
Wenn es erst konvertiert werden muss.

gruss

Namenloser 8. Mai 2011 15:42

AW: Auf Canvas zeichnen, wenn PNG
 
Zitat:

Zitat von Thom (Beitrag 1099562)
Zitat:

Zitat von NamenLozer (Beitrag 1099557)
Du musst das PNG erst auf ein Bitmap kopieren, zum Speichern umgekehrt...

Das ist nicht korrekt.
Folgendes Beispiel funktioniert ohne Probleme:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.LoadFromFile('xxx.png');
  with TPNGImage(Image1.Picture.Graphic) do
  begin
    Canvas.Brush.Color:=clRed;
    Canvas.Rectangle(10,10,50,50);
  end;
  Image1.Refresh;
end;
Wer's nicht glaubt: Ich kann die Demo gern anhängen...
Welche PNGImage-Version verwendest Du?

Hmm, vielleicht funktioniert das unter XE, früher (bei der OpenSource-Version) war TPNGObject.Canvas AFAIR Read-Only.
Inwiefern beim Kopieren der Alpha-Channel erhalten bleibt, weiß ich nicht sicher, aber prinzipiell hätte ein 32Bit-Bitmap Platz dafür.

Ich nutze für die Bearbeitung von PNGs aber eh immer Graphics32 mit der GR32_PNG-Unit...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.
Seite 1 von 2  1 2      

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