Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem beim Speichern einer mit Canvas gezeichneten Grafik (https://www.delphipraxis.net/109176-problem-beim-speichern-einer-mit-canvas-gezeichneten-grafik.html)

blender 25. Feb 2008 19:51


Problem beim Speichern einer mit Canvas gezeichneten Grafik
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich programmiere mit Delphi 7 Personal Edition.
Ich habe allerdings ein kleines Problem: (Man muss dazu sagen, dass ich ein Anfänger bin)
Ich möchte eine mit Canvas, auf den Hintergrund gezeichnete Grafik, als Bild speichern.
Aber wie???

Die Datei ist im Anhang angefügt, und wird bald auch in meinem eigenen Forum verfügbar sein.(Hier klicken)

Für schnelle Hilfe wäre ich sehr Dankbar.

Jens Schumann 25. Feb 2008 20:01

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Hallo,
hier ein kleines Beispiel. Damit kannst Du den Inhalt der canvas als Bitmap speichern
Delphi-Quellcode:
var
  Bitmap : TBitmap;
begin
  Bitmap:=TBitmap.Create;
  Try
    Bitmap.Width:=PaintBox.ClientWidth;
    Bitmap.Height:=PaintBox.ClientHeight;
    BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
           PaintBox.Canvas.Handle,0,0,SRCCOPY);
    Bitmap.SaveToFile('c:\canvas.bmp');
  Finally
    Bitmap.Free;
    end;

Fussball-Robby 25. Feb 2008 20:04

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Hey,
einfach mal Suchfunktion nutzen:

Klick

blender 25. Feb 2008 20:10

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Wie sieht es mit einem SaveDialog aus?

Etwa so?

Delphi-Quellcode:
var
  Bitmap : TBitmap;
begin
  Bitmap:=TBitmap.Create;
  Try
    Bitmap.Width:=PaintBox.ClientWidth;
    Bitmap.Height:=PaintBox.ClientHeight;
    BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
           PaintBox.Canvas.Handle,0,0,SRCCOPY);
    Bitmap.SaveToFile(SaveDialog1);
  Finally
    Bitmap.Free;
    end;
Wie gesagt, ich bin ein Anfänger.

STS301 25. Feb 2008 20:11

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
setzte es einfach zb. unter Button1.click

DeddyH 25. Feb 2008 20:13

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Delphi-Quellcode:
var
  Bitmap : TBitmap;
begin
  if SaveDialog.Execute then
    begin
      Bitmap:=TBitmap.Create;
      Try
        Bitmap.Width:=PaintBox.ClientWidth;
        Bitmap.Height:=PaintBox.ClientHeight;
        BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
               PaintBox.Canvas.Handle,0,0,SRCCOPY);
        Bitmap.SaveToFile(SaveDialog.FileName);
      Finally
        Bitmap.Free;
      end;
    end;
end;

Fussball-Robby 25. Feb 2008 20:13

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
hey,

Delphi-Quellcode:
if SaveDialog1.execute then Bitmap.SaveToFile(SaveDialog1.FileName);
mfg


//Edit Da war wohl einer schneller :-D

blender 25. Feb 2008 20:16

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Danke.
Wo muss der Code hin?
Bei dem SaveDialog?

STS301 25. Feb 2008 20:16

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Zitat:

Zitat von STS301
setzte es einfach zb. unter Button1.click


blender 25. Feb 2008 20:19

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Kann manihn nicht in den SaveDialog packen?
Ist das nicht viel sinnvoller?

Fussball-Robby 25. Feb 2008 20:22

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Nein, da du den SaveDialog zum speichern irgendwie nicht anklicken kannst :-D
Außerdem ruft der Button den SaveDialog im Endeffekt ja sowieso auf

blender 25. Feb 2008 20:26

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Uups...
Das habe ich vergessen.
Wie sieht der Quelltext denn nun für den Button mit dem SaveDialog aus?
(Ohne euch wäre ich hoffnungslos verloren!!!)

Fussball-Robby 25. Feb 2008 20:30

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
DeddyH hat es doch schon so gut wie fertig gezeigt, du musst das nur noch ins OnClick vom Button packen und fertig:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap : TBitmap;
begin
  if SaveDialog1.Execute then
    begin
      Bitmap:=TBitmap.Create;
      Try
        Bitmap.Width:=PaintBox1.ClientWidth;
        Bitmap.Height:=PaintBox1.ClientHeight;
        BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
               PaintBox1.Canvas.Handle,0,0,SRCCOPY);
        Bitmap.SaveToFile(SaveDialog1.FileName);
      Finally
        Bitmap.Free;
      end;
    end;
end;

//EDIT Ich würde dir dazu noch raten, den Filter vom SaveDialog auf *.bmp zu setzen

blender 25. Feb 2008 20:43

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Danke.
Ich habe es ausprobiert.
Die datei wird gespeichert.
Trotzdem gibt es noch zwei Probleme:
1.
Die endung wird nicht automatisch hinzugefügt.
Es müsste also so aussehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap : TBitmap;
begin
  if SaveDialog1.Execute then
    begin
      Bitmap:=TBitmap.Create;
      Try
        Bitmap.Width:=PaintBox1.ClientWidth;
        Bitmap.Height:=PaintBox1.ClientHeight;
        BitBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
               PaintBox1.Canvas.Handle,0,0,SRCCOPY);
        Bitmap.SaveToFile(SaveDialog1.FileName + '.bmp');
      Finally
        Bitmap.Free;
      end;
    end;
end;
Tut es der Filter auch allein?

2.
Da das Bild auf den Hintergrund gezeichnet wird, wird, wenn ich minimiere, der Hintergrund wieder Grau.
Das Passiert auch, wenn man ein Fenster darüber zieht.
Also auch beim SaveDialog.
Kann man das irgendwie beheben?

Fussball-Robby 25. Feb 2008 20:45

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Ich weiß nicht, ob es eine bessere Lösung gibt, aber wenn du statt der Paintbox ein Image nimmst, bleibt das bild auch beim minimieren etc. da

Und zu der Endung, gib einfach beim SaveDialog bei DefaultExt ".bmp" an, dann wird das bmp automatisch hinzugefügt

blender 25. Feb 2008 20:49

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Wie geht das?
(Ich habe doch gesagt, dass ich ein Anfänger bin!!!)
Ich weiß ja, dass TImage automatisch aktualisiert, aber wie krieg ich da mein Diagramm rein?

Wie ist das Programm eigentlich?(Für einen Anfänger)

STS301 25. Feb 2008 20:51

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
unter Filter kannst du es einstellen, sonst ist das Programm nicht schlecht

Fussball-Robby 25. Feb 2008 20:52

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
auf dem Image kannst du genau so zeichnen wie auf der paintbox (also mit Image1.Canvas...)

blender 25. Feb 2008 20:56

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Muss ich dann vor aus jedem Canvas ein Image1.canvas machen?

Fussball-Robby 25. Feb 2008 20:59

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Du hast doch vorher auf der paintbox gezeichnet, also Paintbox1.Canvas, das ersetzt du einfach überall durch Image1.Canvas

blender 25. Feb 2008 21:01

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Ich habe überhaupt nicht auf die Paintbox gezeichnet.
Ich habe einfach: Canvas.moveto(Wasweißich)...
Aber nix mit Paintbox.

Fussball-Robby 25. Feb 2008 21:03

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Okay, das heißt, du hast direkt auf die Form gezeichnet und das speichern des Inhaltes der Paintbox hätte sowieso nichts gebracht.
Aber in dem Fall, ja, du musst Canvas.blabla durch Image1.blabla ersetzen :wink:

blender 25. Feb 2008 21:06

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Ich habe doch am anfang gesagt das ich auf Form1 gezeichnet habe. :lol:
Muss ich auch canvas.pen.color ersetzen?

Fussball-Robby 25. Feb 2008 21:07

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Jupp, alles mit Canvas ersetzen

blender 25. Feb 2008 21:09

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Eine Frage noch:
Kann ich Timage dazu bringen seine Größe an die des Fensters anzupassen?
Wie?

Fussball-Robby 25. Feb 2008 21:11

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Indem du ins OnResize Event der Form
Delphi-Quellcode:
Image1.Height:=Form1.ClientHeight;
Image1.Width:=Form1.ClientWidth;
einfügst.

//Edit: dazu muss das Image aber Top & left =0 sein, also ganz links oben in der form, ansonsten gibts nen fehler...

//Edit²: Noch besser:
Delphi-Quellcode:
Image1.Height:=Form1.ClientHeight-Image1.Top;
Image1.Width:=Form1.ClientWidth-Image1.Left;

blender 26. Feb 2008 19:49

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Bevor ich die neue Version hochlade möchte ich noch eines wissen:
Gibt es so etwas wie:
Delphi-Quellcode:
Image1.Refresh;
Ich habe das "Refresh" meines Formulars in "Image1.Refresh" umgewandelt.
Es funktioniert nicht!!!
Wie leert man die Fläche von Image1?

DeddyH 26. Feb 2008 19:53

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Einfach mit FillRect drübermalen ;)

blender 26. Feb 2008 21:06

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist der neue Download.
Mit Nachfrage vor dem Schließen(leider nur wenn die Aktion durch den Button ausgelöst wird, der X Button kommt noch)
und der Speichern Funktion.
Die gespeicherten Bilder sehen so aus.(Ich habe leider nur einen Download und keine Grafikadresse.)
Ich finde, es sieht ein wenig "pixelig" aus.
Kann man das irgendwie beheben?
Es wird ja so gezeichnet.
Kann Canvas das nicht besser?
Was könnte man noch hinzufügen?

Fussball-Robby 26. Feb 2008 21:55

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Zitat:

Zitat von blender
Kann Canvas das nicht besser?

Image1.Canvas... Das ist Canvas

MfG

ps: Wenn du dein Programm vostellen willst, dann tu das unter Freeware :wink:

blender 27. Feb 2008 10:31

Re: Problem beim Speichern einer mit Canvas gezeichneten Gra
 
Kann man in Delphi vielleicht noch etwas höher Qualitatives(von der Auflösung her) verwenden?
Das muss doch irgendwie möglich sein!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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 by Thomas Breitkreuz