AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas - > Bitmap

Ein Thema von Jonas Shinaniganz · begonnen am 23. Jul 2012 · letzter Beitrag vom 23. Jul 2012
Antwort Antwort
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#1

Canvas - > Bitmap

  Alt 23. Jul 2012, 10:46
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
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: Canvas - > Bitmap

  Alt 23. Jul 2012, 11:04
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Canvas - > Bitmap

  Alt 23. Jul 2012, 11:07
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Canvas - > Bitmap

  Alt 23. Jul 2012, 11:08
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#5

AW: Canvas - > Bitmap

  Alt 23. Jul 2012, 11:13
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;
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Canvas - > Bitmap

  Alt 23. Jul 2012, 11:16
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#7

AW: Canvas - > Bitmap

  Alt 23. Jul 2012, 11:24
Großartig!!

Läuft zwar noch nicht aber müsste gleich alles klappen,

Danke erstmal
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Antwort Antwort


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:19 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