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:
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.
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. 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 |
AW: Auf Canvas zeichnen, wenn PNG
TPNGImage(Image.Picure.Graphic).Canvas.xxx :gruebel:
|
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; |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Jazzman |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Jazzman |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Folgendes Beispiel funktioniert ohne Probleme:
Delphi-Quellcode:
Wer's nicht glaubt: Ich kann die Demo gern anhängen...
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; Welche PNGImage-Version verwendest Du? |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Oder? gruss |
AW: Auf Canvas zeichnen, wenn PNG
Genau - das kommt auch noch als "Nebeneffekt" hinzu! :thumb:
|
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Wenn es erst konvertiert werden muss. gruss |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
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... |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Konvertiere ein PNG nach Bitmap und siehe was dann vom alpha Channel noch übrigbleibt. Ein Weißer Hintergrund mehr nicht... die Transparenz wird komplett entfernt. gruss |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Ich habe schon mit ganz normalen Bitmaps mit Alphachannel gearbeitet... war überhaupt kein Problem. Du darfst nur nicht die veralteten GDI-Routinen zum Zeichnen nutzen. |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Teste es doch ganz einfach ;) gruss |
AW: Auf Canvas zeichnen, wenn PNG
Ich will mal GDI+ als Stichwort einwerfen. Da das PNG von Natur aus unterstützt, wird es wohl auch keine Probleme geben, wenn man mit den GDI+-Routinen auf das Bild malt.
Bernhard |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Übrigens steht bei Delphi XE in der PNGImage-Unit
Delphi-Quellcode:
Gibt es da evtl. zu älteren Versionen einen Unterschied?
const
LibraryVersion = '1.564'; //... TPngImage = class{$IFDEF UseDelphi}(TGraphic){$ENDIF} //... public //... {Canvas} {$IFDEF UseDelphi}property Canvas: TCanvas read fCanvas;{$ENDIF} //... end. Edit: Ich hab's jetzt noch einmal mit Delphi 5 getestet, als TPNGImage noch TPNGObject hieß: Das Zeichnen auf den TPNGxxx-Canvas funktioniert definitiv! |
AW: Auf Canvas zeichnen, wenn PNG
Liste der Anhänge anzeigen (Anzahl: 1)
OK, ich habe es getestet:
@EWeiss: Das heißt aber nicht dass es nicht möglich wäre den AlphaChannel zu erhalten. PNGDelphi macht es nur einfach nicht, und die meisten Programme auch nicht. Im Anhang befindet sich ein DUnit-TestProjekt, in dem auch eine Methode gezeigt wird, wie man den Alphachannel erhalten kann (man kann dann aber nicht die GDI zur Weiterverarbeitung nutzen). Das Rückkopieren von einem Bitmap in ein PNG geht ähnlich. Aber wenn es auch direkt mit TPNGObject.Canvas geht, ist das natürlich eh unnötig... |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Sicherheitshalber danach ein Graphic.Flush() ausführen, dass auch wirklich gezeichnet wurde und nicht nur die Aufträge dazu gegeben wurden. Bernhard |
AW: Auf Canvas zeichnen, wenn PNG
Zitat:
Text auf ein PNG zeichen ist ja quasi das gleiche. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 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