![]() |
Canvas - > Bitmap
Hallo,
Ich habe schon fleißig das Forum durchstöbert und auch einiges gefunden aber leider konnte Ich mir daraus nichts funktionsfähiges gutes zusammenbasteln. Habe nur was von dpi, metafiles etc etc gelesen... Ich habe eine Komponente die auf einem Canvas Grapiken zeichnet. Die Komponente ist an Ihrem einsatzort nicht sonderlich groß. Mein Problem: Die Canvas - Auflösung ist abhängig vom Bildschirm. Ich würde gerne eine zweite Canvas für meine Komponete erstellen, welche nie sichtbar ist und deren width / height in Pixeln von mir angegeben wird. Ich möchte jetzt im Grunde folgendes machen: Die Canvas der Grapik-Komponente soll ohne sich zu zeichnen (also non-visuell) auf eine 2000px mal 2000 px Fläche skaliert werden, diese Werte würde ich evt noch gerne dynamisch machen. Dann wird das onscale event ja automatisch ausgelöst und die canvas wird neu gezeichnet.(allerdings wieder nicht sichtbar). Zum Schluss mit meiner SaveCanvas - Methode abgespeichern. Sobald Ich die unsichtbare Canvas mit meiner wunschauflösung gezeichnet habe komme Ich wieder alleine klar ;) Meine Canvas Save Methode sieht so aus:
Delphi-Quellcode:
So stelle Ich mir meine Neue Klasse vor:
procedure SaveCanvas(SaveCanvas : TCanvas; FileName : string);
var Bitmap : TBitmap; begin Bitmap := TBitmap.Create; Try // Hier nicht 500x500 sonder die Width / Heigth der Canvas, welche Ich dann mit // Client-Rect berechne oder mit übergebe Bitmap.Width := 500; Bitmap.Height := 500; BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height, SaveCanvas.Handle,0,0,SRCCOPY); Bitmap.SaveToFile(FileName); Finally Bitmap.Free; end; end;
Delphi-Quellcode:
Kann mir jemand weiterhelfe? Ich habe Keine Ahnung wie Ich der Canvas Befehle eine feste größe zu haben und sich dann entsprechend vollzeichnen zu lassen um für meinen Export bereit zu stehen.type TSimpleChartScaleable := class(TSimpleChart); InvisWidth : Integer; InvisHeigth : Integer; InvisCanvas : TCanvas; Grüße |
AW: Canvas - > Bitmap
Ein Canvas ist nur eine Schnittstelle zu einer Zeichenfläche ... es selber ist niemals sichtbar oder unsichtbar.
Du bräuchtest wohl eher ein unsichtbares/weiteres Bitmap, worauf du "versteckt" zeichnen kannst. |
AW: Canvas - > Bitmap
Erstelle eine TBitmap, gibt ihr deine Width und Height Werte, dann zeichne auf der Canvas der Bitmap. Die Canvas hat permanent dann die Größe von Width und Height.
|
AW: Canvas - > Bitmap
Ist das eine eigene Komponente, bzw. eine Komponente die Du im Source hast, wenn ja würde ich im Paint das Canvas einmal abstrahieren
Delphi-Quellcode:
und alle Zeichenausgaben auf c biegen. Ein Invalidate genügt dann um auf dem Bitmap.Canvas zu malen.
var
c:TCanvas; begin if Assigned(FExportCanvas) then c := FExportCanvas else c := Canvas; end; Wenn Deine Komponente scaliert muß an der Stelle wo Width und Height verwendet werden auch geprüft werden ob FExportCanvas zugewiesen ist und gegf .Breite/Höhe der Bitmap gezogen werden |
AW: Canvas - > Bitmap
Danke für Idee, ja Ich habe alle Sourcen. Allerdings halte Ich es für besser nicht immer ein unsichtbares Canvas rumliegen zu haben was auch immer aktualisiert wird sondern nur in dem moment des Exports einmal alles zu erstellen und zu exportieren und dann wieder zu vernichten.
Hab auch nur über das Canvas nachgedacht weil Ich noch nicht weiß wie Ich zu meiner Lösung (Das Rendern bei einer beliebigen größe im Hintergrund) komme. Ich würde jetzt sowas versuchen:
Delphi-Quellcode:
type TSimpleChartScaleable := class(TSimpleChart); public function GetBitmap(Width : Integer; Heigth : Integer) : TBitmap; implementation function GetBitmap(Width : Integer; Heigth : Integer) : TBitmap; var Bitmap : TBitmap; begin Bitmap := TBitmap.Create(Self); // wie greife Ich auf die Schnittstelle zu und lasse auf mein Bitmap zeichnen? Bitmap.Width := Width; Bitmap.Heigth := Heigth ; Result := Bitmap; end; |
AW: Canvas - > Bitmap
Delphi-Quellcode:
implementation
function GetBitmap(Width : Integer; Heigth : Integer) : TBitmap; var Bitmap : TBitmap; begin // Wie könnte Ich Bitmap := TBitmap.Create(Self); // wie greife Ich auf die Schnittstelle zu und lasse auf mein Bitmap zeichnen? FExportCanvas := Bitmap.Canvas; try Invalidate; finally FExportCanvas := nil; end; Result := Bitmap; end; |
AW: Canvas - > Bitmap
Großartig!!
Läuft zwar noch nicht aber müsste gleich alles klappen, Danke erstmal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 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