Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Bild "richtig" speichern?


Tony-S - Mo 22.06.09 22:02
Titel: Bild "richtig" speichern?
Ich hab denk ich mal ein einfach zu lösendes Problem und zwar möchte ich ein von mir verändertes Bild als jpg speichern.
Das funktioniert soweit auch ganz gut, aber ich kann es leider nur per "öffnen mit" öffnen.

Das hab ich einfach mal so gemacht:


Delphi-Quelltext
1:
2:
3:
SaveDialog1.Options := [ofOverWritePrompt];
SaveDialog1.Filter:='jpg  files (*.jpg)|*.';
IF SaveDialog1.Execute then Image2.Picture.bitmap.SavetoFile(SaveDialog1.FileName);


- gibt es da irgendeine Option die der Datei ein Standardprogramm zum öffnen zuweist?

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 22.06.2009 um 22:28


Xentar - Mo 22.06.09 22:16

Du könntest die Endung da eintragen, wo sie hingehört?

Delphi-Quelltext
1:
SaveDialog1.Filter:='jpg files (*.jpg)|*.jpg';                    

Das (*.jpg) vorher hat keine Auswirkung, da dies nur der Text ist, der in der Auswahlliste erscheint.


Narses - Mo 22.06.09 22:28

Moin!

user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
IF SaveDialog1.Execute then Image2.Picture.bitmap.SavetoFile(SaveDialog1.FileName);                    
Es sollte mich wundern, wenn dieser Code im Jpeg-Format schreibt... :? Nur .jpg dranschreiben nutzt nix. ;)

cu
Narses


Tony-S - Mo 22.06.09 22:30

hm also das hier geht:

Delphi-Quelltext
1:
IF SaveDialog1.Execute then Image2.Picture.bitmap.SavetoFile(SaveDialog1.FileName+'.jpg');                    

auch wenn ich das nich gedacht hätte :> muss ich aber noch unterscheiden ob das vorher bmp ico oder jpg war (hab ich so festgelegt).

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Narses - Mo 22.06.09 22:32

Moin!

Ich bestreite ja gar nicht, dass dieser Code eine Bilddatei erzeugt - aber eben im WindowsBitmap-Format, und kein Jpeg. :idea:

cu
Narses


Tony-S - Mo 22.06.09 22:34

Oh, was heißt das denn? Also macht das viel aus ^^?


jfheins - Mo 22.06.09 23:39

Das kommt drauf an - du kannst natürlich eine Ferrari-Karrosserie auf einen VW-Bus stecken, und das Teil wird auch noch fahren, aber so richtig toll isses nicht ;)

Speicher die Datei also lieber mit der korrekten Dateiendung (in diesem Fall ".bmp") oder biete mehrere Dateiformate an (jpeg musst du seperat programmieren)


Tony-S - Di 23.06.09 22:16

Hm ich merk glaube was das Problem is, wenn ich jetzt dieses gespeicherte jpeg mit dem Programm öffne dann bekomm ich n jpg Error ;D.


jaenicke - Di 23.06.09 22:23

Naja, nur weil du ein Brot in eine Kiste mit der Aufschrift Tomaten legst, wird es nicht zu Tomaten... ;-)
Und nur weil du eine Bitmap in einer Datei mit der Dateierweiterung .jpg speicherst, wird aus der Bitmap kein Jpeg. ;-)

Dafür musst du die Unit Jpeg einbinden und mit TJpegImage arbeiten.


Tony-S - Fr 26.06.09 13:03

Hmm hmm ok, aber die Unit jpeg einbinden, wie meinst du das, meinst du damit die uses jpeg?
Ich lad nämlich das Bild auf eine Extra Form ohne Image, eben direkt auf die Form, lässt sich das dann immernoch speichern?


elundril - Fr 26.06.09 13:09

Oben in deinem Formular sollte sowas stehen wie uses und danach ne ganze liste von wörtern, alle mit einem beistrich getrennt und einen strichpunkt abgeschlossen. In diese Liste must du JPEG schreiben.

Also, richtig angenommen ;)


Delete - Fr 26.06.09 13:16

Wo die Bitmap dargestellt wird (TImage oder auf der Form oder wo auch immer), ist ja unerheblich, solange sie noch gültig ist (damit meine ich, dass das Objekt noch vorhanden ist). Eine ganz kurze ausbaufähige Variante könnte etwa so aussehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
uses ...,jpeg;

...

var JPG: TJPEGImage;
begin
  if SaveDialog.Execute then
    begin
      JPG := TJPEGImage.Create;
      try
        JPG.Assign(Bitmap);
        JPG.SaveToFile(SaveDialog.Filename);
      finally
        JPG.Free;
      end;
    end;
end;

Getippt und nicht getestet.


Tony-S - Fr 26.06.09 20:58

Danke erstmal für die Hilfe,
ich war jetzt erstmal am probieren ob ich das mit deinem Text so hinbekomm,
das Assign müsst ich ja rein vom Prinzip her auf das "Bild" anwenden, welches ich verändert hab.
Der Restt müsste ja dann klappen, hängt also noch am Assign.

Hm dieses Free löschts wieder ausm Arbeitsspeicher oder? ^^ Wüsst jetzt nich wozu das sonst ist.


Delete - Fr 26.06.09 21:01

Richtig, Free gibt das dynamisch angelegte Objekt wieder frei. Und das Assign musst Du auf Deine Bitmap anwenden (z.B. Image1.Picture.Bitmap).


Yogu - Fr 26.06.09 21:03

Ich will euch ja nicht den Spaß verderben, aber hat jemand von euch schonmal was von TPicture.SaveToFile gehört? Da kann man sogar angeben, in welches Format gespeichert werden soll.

Anstatt eines TSaveDialog solltest du einen TSavePictureDialog verwenden. Dort muss auch rein gar nichts mehr geändert werden. Also so:


Delphi-Quelltext
1:
2:
SavePictureDialog1.Options := [ofOverWritePrompt];
IF SavePictureDialog1.Execute then Image2.Picture.SavetoFile(SavePictureDialog1.FileName);

- und fertig ;)


Tony-S - Fr 26.06.09 21:05

Den Dialog hab ich ja :P


Yogu - Fr 26.06.09 21:06

user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Den Dialog hab ich ja :P

Dann brauchst du erstens den Filter nicht anzupassen, und zweitens solltest du trotzdem Image2.Picture.SaveToFile verwenden. Dann speichert Delphi automatisch in dem Format, das zur Dateiendung, die Im Dialog angegeben wurde, passt.


Tony-S - Fr 26.06.09 21:08

Ja, aber so richtig klappt das nich :/ , ich probier mal bissl rum.. wenns nich klappt frag ich nochma ^^

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

image.canvas.draw (0,0,bild);

Hm hier "mal" ich ja mein verändertes Bild auf meine Form (image), also dachte ich, dass ich das JPG.Assign zu eben diesem "Bild" nehmen muss.
Oder denk ich jetzt falsch?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Oh, es geht ja doch :D bis jetzt jedenfalls, jop öffnen geht auch.
Vielen dank das ir mir geholfen habt, so hab ich gleich wieder was gelernt :D, bisher nahm ich an,
das es reicht einfach die Endung an den Dateinamen zu hängen. Jetzt weiß ichs besser thx.