AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Auf Canvas zeichnen, wenn PNG
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Canvas zeichnen, wenn PNG

Ein Thema von Jazzman_Marburg · begonnen am 8. Mai 2011 · letzter Beitrag vom 8. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 15:24
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 15:36
TPNGImage(Image.Picure.Graphic).Canvas.xxx
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 15:48
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;

Geändert von Namenloser ( 8. Mai 2011 um 17:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#4

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 15:56
TPNGImage(Image.Picure.Graphic).Canvas.xxx
Der gleiche Fehler.

Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#5

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 15:57
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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 16:13
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?
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 16:21
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
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 16:24
Genau - das kommt auch noch als "Nebeneffekt" hinzu!
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 16:39
Genau - das kommt auch noch als "Nebeneffekt" hinzu!
Und dann macht es keinen Sinn mehr ein PNG einzuladen und darauf zu zeichnen.
Wenn es erst konvertiert werden muss.

gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Auf Canvas zeichnen, wenn PNG

  Alt 8. Mai 2011, 16:42
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...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:41 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