![]() |
Canvas in TBitmap ???
Hi,
hab mal wieder eine sicherlich leicht zu beantwortende Frage für euch. Hab schon oft gelesen, dass man z.Bsp.: auf eine PaintBox etwas zeichnet und dies dann in TImage umwandeln kann. Ist dies richtig und welche Vorteile würde mir das bringen. Würde mich über zahlreiche Antworten freuen - denkt bitte daran ich bin kein Informatiker nur ein einfacher Info-Schüler :wink: !! Vielen Dank |
Re: Canvas in TImage ???
ich vermute du kannst die bitmap der paintbox der bitmap des Images mit assign zuweisen, jedoch seh ich da keinen Sinn. Warum erst Paintbiox nhemen dann auf das image knallen wenn man auch gleich nen Image nehmen kann?
Also ich nehme für so zeichen zeugs immer nen TImage |
Re: Canvas in TImage ???
Eine PaintBox ist schneller.
Du brauchst dann kein Image, um das Bild der Paintbox zu speichern, falls du das (Image1.SaveToFile()) vorhast. Einfach ein Bitmap erstellen und da den Inhalt der Paintbox draufknallen. |
Re: Canvas in TImage ???
"Zeichne" auf eine TBitmap im "Hintergrund".
Wenn du alles gezeichnet hast, malst du alles über Canvas.Draw(x,y, TBitmap) auf dein Formular. Im OnPaint Ereignis deines Fensters zeichnest du die Grafik neu. |
Re: Canvas in TImage ???
bitblt wäre performanter. da fallen einige überprüfungen weg in der vcl
|
Re: Canvas in TBitmap ???
Hi,
ich merk gerade, dass ich ein inhaltlichen Fehler eingebaut habe. Ich möcht natürlich wissen wie ich ein mit Canvas gezeichnetes Bild (über PaintBox) in TBitmap transformieren kann. Ich bitte um möglichst leicht verständliche Code-Schnipsel oder alles was mir weiter hilft. cu |
Re: Canvas in TBitmap ???
Hallo, ich hoffe, dass der folgende Code richtig in meinem Kopf abgespeichert ist!
Du benötigst ne PaintBox!
Delphi-Quellcode:
Nun kannst du durch die Canvas Eigenschaft der Bitmap alles Zeichenoperationen durchführen!
var
Bitmap: TBitmap; ... procedure TForm1.FormCreate(Sender: TObject); begin Bitmap:= TBitmap.Create; //erstellt eine Bitmap Bitmap.PixelFormat:= pf32bit; //Bitmap erhält eine Bittiefe von 32 Bit (hohe Qualität) Bitmap.Heigth:= PaintBox1.Heigth; //Höhe der Bitmap ist gleich der Höhe der Paintbox Bitmap.Width:= Paintbox1.Width; //Breite der Bitmap ist gleich der Breite der Paintbox PaintBox1.Canvas.Draw(0,0,Bitmap); //Bitmap wird in Paintbox gezeichnet Bitmap.SaveToFile('C:\1.bmp'); //Bitmap wird als Bitmap auf Festplatte abgespeichert end; |
Re: Canvas in TBitmap ???
thx @ hansklok ,damit kann ich was anfangen
|
Re: Canvas in TBitmap ???
Hallo,
habe auch versucht das Bild einer Paintbox in ein Bitmap zu zeichnen und dieses dann abzuspeichern. Habe schon verschiedene Methoden probiert, aber keine hat funktioniert. Habe es jetzt auch einmal mit dem Code von hansklok probiert. Damit erhielt ich keine Fehlermeldung (musste nur heigth in height umändern) und es wurde auch etwas gespeichert. Allerdings wurde dabei der Inhalt meiner Paintbox gelöscht und die gespeicherte Datei ist auch nur weiß, also leer. Außerdem würde ich gerne selber einen Namen für das Bild eingeben und den Speicherort bestimmen. Dies kann man doch dann eigentlich nur mit einem SaveDialog machen, oder? Also so etwa.
Code:
Dabei erhalte ich allerdings immer die Fehlermeldung undefinierter Bezeichner SaveToFile oder so oder mein Programm stürzt ab, sobald ich auf Speicher klicke.
Bitmap.SaveToFile(SaveDialog1.Filename);
Waran liegt das? Auch mit picture.savetofile funktioniert das ganze nicht. wäre wriklich toll, wenn mir jemand weiterhelfen könnte. schonmal vielen dank im voraus!! liebe grüße san |
Re: Canvas in TBitmap ???
Zitat:
ich habe bisher nur sehr wenig mit tcanvas gearbeitet, aber muss es nicht anstatt
Delphi-Quellcode:
so heißen
PaintBox1.Canvas.Draw(0,0,Bitmap); //Bitmap wird in Paintbox gezeichnet
Delphi-Quellcode:
wenn ich mich irre verbessert mich bitte.
Bitmap.Canvas.Draw(0,0,PaintBox1); //Bitmap wird in Paintbox gezeichnet
mfg das magier |
Re: Canvas in TBitmap ???
danke für deine schnelle antwort.
Zitat:
Code:
habe den savedialog auch per savedialog1.execute aufgerufen, aber hat trotzdem nicht geklappt.
[Fehler] soundU.pas(142): Inkompatible Typen: 'TGraphic' und 'TPaintBox'
edit: habe das gerade nochmal den code von hansklok verwendet und daort dann den savedialog eingesetzt, dann hat es doch geklappt. :bounce1: allerdings ist das abgespeicherte bitmap immer noch weiß ... liebe grüße san |
Re: Canvas in TBitmap ???
poste hier bitte noch mal deinen jetztigen quellcode.
|
Re: Canvas in TBitmap ???
Code:
procedure TForm1.Speichern(Sender: TObject);
var Bitmap: TBitmap; begin Bitmap:= TBitmap.Create; //erstellt eine Bitmap Bitmap.PixelFormat:= pf32bit; //Bitmap erhält eine Bittiefe von 32 Bit (hohe Qualität) Bitmap.Height:= PaintBox1.Height; //Höhe der Bitmap ist gleich der Höhe der Paintbox Bitmap.Width:= Paintbox1.Width; //Breite der Bitmap ist gleich der Breite der Paintbox PaintBox1.Canvas.Draw(0,0,Bitmap); //Bitmap wird in Paintbox gezeichnet if savedialog1.execute then Bitmap.SaveToFile(SaveDialog1.Filename); //Bitmap wird als Bitmap abgespeichert end; |
Re: Canvas in TBitmap ???
das gespeichert bitmap is daher weis, weil du damit nichts machst du gibst nur qualität, höhe und breite an und dann lässt du es ja auch schon speichern es kann also nur weis sein.
|
Re: Canvas in TBitmap ???
Zitat:
Zitat:
|
Re: Canvas in TBitmap ???
aber wenn ich eben anstatt bitmap (ist eigentlich klar, dass es dann weiß bleibt :wall: ) paintbox1 einsetze bekomme ich die fehlermeldug mit den inkompatiblen typen.
wie kann ich das denn umgehen? das verstehe ich eben nicht, eben auch nicht, warum das so nicht geht. der inhalt ist doch sowohl im bitmapm als auch in der paintbox graphisch und das programm wird doch nur aufgefordert, eben diesen graphischen inhalt zu übernehmen. wieso dann inkompatible typen? |
Re: Canvas in TBitmap ???
warum nimmst du denn nicht einfach ne image komponente anstatt der paintbox?
|
Re: Canvas in TBitmap ???
brauche ne paintbox in meinem programm, da sie schnell immer wieder neu gezeichnet werden muss...
und das wäre mit nem image ja nicht möglich, oder? |
Re: Canvas in TBitmap ???
du sollst ja auch im private teil sollste ne variable des typs TBitmap deklarieren und auf dem zeichnen und das kannste dann auch speichern und zum speichern nimmste einfach nur die IF-anweisung wie du sie hast nur eben für das Bitmap was du im private teil deklariert hast.
|
Re: Canvas in TBitmap ???
versteh nich ganz, was du meinst.
wenn ichdie bitmap variable im private teil,anstatt in der prozedure selber deklariere und meine procedure sonst so lasse (kann ich das?), dann bekomme ich immer noch den fehler von inkompatiblen typen. das speichern ist ja auch im moment nich mehr mein problem, sonder das TBitmap mit Inhalt zu füllen. |
Re: Canvas in TBitmap ???
also ich hab das so gemeint du deklarierst ne variable vom TBitmap in private, auf der Variable/Bitmap kannst du dann zeichnen bzw. zeichnen lassen dann lässt du der Bitmap in die Paintbox zeichnen und du kannst die Variable/Bitmap mit der IF-Anweisung speichern. die eigenschaften der Bitmap und das erstellen machst du in der Create procedure der Form.
|
Re: Canvas in TBitmap ???
Ich glaube Birzenbae meint folgendes: Zeichne nicht direkt in die PaintBox, sondern zeichne auf den Canvas eines TBitmaps dass du immer im Speicher hälst. Bei Bedarf kopierst du dieses dann zum Anzeigen in die PaintBox (Draw, BitBlt, ...), oder speichert es mit SaveToFile ab.
Dann hast du eine Variable im Hintergrund aus der heraus du sowohl anzeigen, als auch speichern kannst. Gruss, Fabian |
Re: Canvas in TBitmap ???
Zitat:
|
Re: Canvas in TBitmap ???
ja das hängt dann davon ab ob er zeichnen oder es zeichnen lassen will, weil will er zeichnen lassen also vom programm selbst ist TImage besser da es zum anzeigen gedacht ist, will er jedoch selbst ist paintbox angebrachter da es wieder name schon sagt zum malen bzw. zeichnen gedacht ist, jedoch sollte nicht direkt auf die canvas der paintbox gezeichnet werden, sondern mit hilfe der größe der paintbox auf die canvas der TBitMap und dann in die Paintbox zeichnen lassen, da wenn er direkt auf die canvas der Paintbox zeichnen ist die zeichnung weg wenn ein fenster drüber ist oder er minimiert und dann maximiert.
|
Re: Canvas in TBitmap ???
verstehe das im moment alles nicht so wirklich, da ich mich mit delphi noch nicht so gut auskenne und vorallem nicht mit bitmaps.
kann mir das nicht vielleicht jemand in eine einfache ButtonClick procedure oder so schreiben? damit wäre mir glaube ich am meißten geholfen, da ich sonst bestimmt nur immer neue probleme hätte, weil ich selbst einfache sachen nicht hinbekommen würde. |
Re: Canvas in TBitmap ???
@san dann sag mal was genau du haben bzw. machen willst, denn erst dann können wir dir wirklich helfen.
|
Re: Canvas in TBitmap ???
also, ich habe eine paintbox, in die in meinem programm eben etwas gezeichnet wird. wenn diese bild dann fertig gezeichnet ist, würde ich es gerne speichern.
also eigentlich möchte ich "nur" den inhalt einer paintbox speichern |
Re: Canvas in TBitmap ???
da paintbox kein savetofile besitzt wirst wohl oder übel über TBitMap speichern müssen und das machst du dann so:
ins private kommt das
Delphi-Quellcode:
in die OnCreate-procedure der Form kommt das hier
Bild: TBitmap; //deklaration der variable Bild vom type TBitmap
Delphi-Quellcode:
und dann wenn du speichern willst kommt das z.B. in die OnClick-procedure eines Buttons
Bild:=TBitmap.Create; //Bitmap in den Speicher Laden
Bild.Height:=PaintBox1.Height; //höhe Bild.Width:=Paintbox1.Width; //Breite der Bitmap festlegen //kannst evtl. noch hier die qualität festlegen
Delphi-Quellcode:
so das wäre das reine speichern von einer Paintbox per Bitmap
BitBlt(Bild.Canvas.Handle, 0, 0, PaintBox1.Width, PaintBox1.Height,
PaintBox1.Canvas.Handle, 0, 0, SRCCOPY); //um von paintbox in Bitmapt/Bild zu zeichnen if SaveDialog1.Execute then Bild.Savetofile(SaveDialog1.Filename) //speichern else exit; //sonst verlassen des SaveDialogs natürlich musst du noch die funktionen um auf die Paintbox zu zeichnen noch selbst reinschreiben. wenn die Paintbox dann bemalt ist und du speicherst sollte deine gespeicherte bitmap auch das enthalten was die Paintbox enthielt. |
Re: Canvas in TBitmap ???
vielen Dank Birzenbae!!! :cheers:
jetzt klappt das speichern!!! :bounce2: :bounce1: :bouncing4: :hello: Liebe Grüße San PS: noch ein kleiner Hinweis, in der 2. Zeile des 3. Quelltextes hast du aus versehen PaintBox.Height anstatt PaintBox1.Height geschrieben. |
Re: Canvas in TBitmap ???
ach man hilft doch gerne....
hab doch gewusst das irgendwas mal wieder falsch ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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