Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas in TBitmap ??? (https://www.delphipraxis.net/36782-canvas-tbitmap.html)

GLaforge 25. Dez 2004 18:01


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

Eichhoernchen 25. Dez 2004 23:13

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

Matze 25. Dez 2004 23:19

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.

bigg 25. Dez 2004 23:39

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.

supermuckl 25. Dez 2004 23:40

Re: Canvas in TImage ???
 
bitblt wäre performanter. da fallen einige überprüfungen weg in der vcl

GLaforge 26. Dez 2004 12:54

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

hansklok 26. Dez 2004 13:02

Re: Canvas in TBitmap ???
 
Hallo, ich hoffe, dass der folgende Code richtig in meinem Kopf abgespeichert ist!

Du benötigst ne PaintBox!

Delphi-Quellcode:
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;
Nun kannst du durch die Canvas Eigenschaft der Bitmap alles Zeichenoperationen durchführen!

GLaforge 26. Dez 2004 13:10

Re: Canvas in TBitmap ???
 
thx @ hansklok ,damit kann ich was anfangen

San 4. Jan 2005 22:06

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:
Bitmap.SaveToFile(SaveDialog1.Filename);
Dabei erhalte ich allerdings immer die Fehlermeldung undefinierter Bezeichner SaveToFile oder so oder mein Programm stürzt ab, sobald ich auf Speicher klicke.
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

Magier 4. Jan 2005 22:25

Re: Canvas in TBitmap ???
 
Zitat:

Zitat von San
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:
Bitmap.SaveToFile(SaveDialog1.Filename);
Dabei erhalte ich allerdings immer die Fehlermeldung undefinierter Bezeichner SaveToFile oder so oder mein Programm stürzt ab, sobald ich auf Speicher klicke.
Waran liegt das?
Auch mit picture.savetofile funktioniert das ganze nicht.

wird der savedialog den auch per savedialog1.execute aufgerufen?

ich habe bisher nur sehr wenig mit tcanvas gearbeitet, aber muss es nicht anstatt
Delphi-Quellcode:
PaintBox1.Canvas.Draw(0,0,Bitmap); //Bitmap wird in Paintbox gezeichnet
so heißen
Delphi-Quellcode:
Bitmap.Canvas.Draw(0,0,PaintBox1); //Bitmap wird in Paintbox gezeichnet
wenn ich mich irre verbessert mich bitte.

mfg
das magier

San 4. Jan 2005 22:37

Re: Canvas in TBitmap ???
 
danke für deine schnelle antwort.

Zitat:

Zitat von Magier
ich habe bisher nur sehr wenig mit tcanvas gearbeitet, aber muss es nicht anstatt
Delphi-Quellcode:
PaintBox1.Canvas.Draw(0,0,Bitmap); //Bitmap wird in Paintbox gezeichnet
so heißen
Delphi-Quellcode:
Bitmap.Canvas.Draw(0,0,PaintBox1); //Bitmap wird in Paintbox gezeichnet

wenn man PaintBox1 anstatt Bitmap verwendet, kommt di Fehlermeldung
Code:
[Fehler] soundU.pas(142): Inkompatible Typen: 'TGraphic' und 'TPaintBox'
habe den savedialog auch per savedialog1.execute aufgerufen, aber hat trotzdem nicht geklappt.
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

Magier 4. Jan 2005 22:45

Re: Canvas in TBitmap ???
 
poste hier bitte noch mal deinen jetztigen quellcode.

San 4. Jan 2005 22:46

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;

Birzenbae 4. Jan 2005 23:03

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.

Wuaegner 4. Jan 2005 23:04

Re: Canvas in TBitmap ???
 
Zitat:

allerdings ist das abgespeicherte bitmap immer noch weiß ...
Zitat:

ich habe bisher nur sehr wenig mit tcanvas gearbeitet, aber muss es nicht anstatt
Quellcode: markieren
PaintBox1.Canvas.Draw(0,0,Bitmap); //Bitmap wird in Paintbox gezeichnet


so heißen
Quellcode: markieren
Bitmap.Canvas.Draw(0,0,PaintBox1); //Bitmap wird in Paintbox gezeichnet



wenn ich mich irre verbessert mich bitte.
Er hat doch schon geschrieben warum es weiß bleibt.

San 4. Jan 2005 23:12

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?

Magier 4. Jan 2005 23:18

Re: Canvas in TBitmap ???
 
warum nimmst du denn nicht einfach ne image komponente anstatt der paintbox?

San 4. Jan 2005 23:23

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?

Birzenbae 4. Jan 2005 23:40

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.

San 4. Jan 2005 23:49

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.

Birzenbae 5. Jan 2005 00:20

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.

dizzy 5. Jan 2005 00:36

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

Magier 5. Jan 2005 01:29

Re: Canvas in TBitmap ???
 
Zitat:

Zitat von Birzenbae
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.

dann kann er auch direkt timage nehmen.

Birzenbae 5. Jan 2005 14:50

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.

San 5. Jan 2005 16:28

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.

Birzenbae 5. Jan 2005 17:14

Re: Canvas in TBitmap ???
 
@san dann sag mal was genau du haben bzw. machen willst, denn erst dann können wir dir wirklich helfen.

San 5. Jan 2005 18:41

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

Birzenbae 5. Jan 2005 21:33

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:
Bild: TBitmap; //deklaration der variable Bild vom type TBitmap
in die OnCreate-procedure der Form kommt das hier
Delphi-Quellcode:
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
und dann wenn du speichern willst kommt das z.B. in die OnClick-procedure eines Buttons
Delphi-Quellcode:
  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
so das wäre das reine speichern von einer Paintbox per Bitmap
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.

San 5. Jan 2005 22:24

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.

Birzenbae 5. Jan 2005 22:27

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 03:55 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