Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Canvas - > Bitmap (https://www.delphipraxis.net/169479-canvas-bitmap.html)

Jonas Shinaniganz 23. Jul 2012 10:46

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:
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;
So stelle Ich mir meine Neue Klasse vor:
Delphi-Quellcode:
 
type
  TSimpleChartScaleable := class(TSimpleChart);
    InvisWidth : Integer;
    InvisHeigth : Integer;
    InvisCanvas : TCanvas;
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.

Grüße

himitsu 23. Jul 2012 11:04

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.

Popov 23. Jul 2012 11:07

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.

Bummi 23. Jul 2012 11:08

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:
var
c:TCanvas;
begin
  if Assigned(FExportCanvas) then c := FExportCanvas else c := Canvas;
end;
und alle Zeichenausgaben auf c biegen. Ein Invalidate genügt dann um auf dem Bitmap.Canvas zu malen.
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

Jonas Shinaniganz 23. Jul 2012 11:13

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;

Bummi 23. Jul 2012 11:16

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;

Jonas Shinaniganz 23. Jul 2012 11:24

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