![]() |
jpeg in FileStream speichern
Hallo,
Ich versuche nun schon eine ganze weile ein jpeg in einen filestream zuspeichern. Vorher lade ich das jpeg entweder aus einem bitmap oder aus einem vorhandenen jpeg. leider wird beim speichern gar nichts geschrieben... Und ich weiß nicht warum :( Das ist der Code den ich verwende:
Delphi-Quellcode:
Liebe Grüße
var
Datei : TFileStream; jpeg : TJpegImage; bmp : TBitmap; begin Datei := TFileStream.Create(Savedialog1.FileName,fmOpenWrite); // Bild laden jpeg := TJpegImage.Create; jpeg.CompressionQuality := 90; If ExtractFileExt(mmFiles.Lines[i]) = '.bmp' then begin bmp := TBitmap.Create; bmp.LoadFromFile(mmFiles.Lines[i]); jpeg.Assign(bmp); bmp.Free; end else jpeg.LoadFromFile(mmFiles.Lines[i]); jpeg.Compress; // in Stream schreiben jpeg.SaveToStream(datei); jpeg.Free; Daniel |
Re: jpeg in FileStream speichern
Ist die Datei schon vorhanden? Ansonsten müsstest du anstatt fmOpenWrite -->fmCreate verwenden.
Und hat jpeg keine SaveToFile-Methode? |
Re: jpeg in FileStream speichern
Hallo,
erstens würde ich hier auch fmCreate nehmen, weil die Datei allerwahrscheinlichkeit nach nicht existiert. Ich würde auch zweitens folgenden Code empfehlen:
Delphi-Quellcode:
Der Vorteil bei dieser geänderten Version liegt darin, dass TPicture alle verfügbaren Dateiformate lesen kann (auch JPEG, etc.), sobald die Unit für den Graphic-Typ in die Uses-Liste eingetragen wird. (Es geht z.B. auch PNG).
var
Datei : TFileStream; jpeg : TJpegImage; Bild: TPicture; begin Datei := TFileStream.Create(Savedialog1.FileName,fmCreate); // JPEG erzeugen jpeg := TJpegImage.Create; jpeg.CompressionQuality := 90; Bild := TPicture.Create; Bild.LoadFromFile(mmFiles.Lines[i]); jpeg.Assign(Bild.Graphic); jpeg.Compress; Bild.Free; // in Stream schreiben jpeg.SaveToStream(datei); jpeg.Free; datei.free; Des weiteren hast du für ein Speicherleck gearbeitet, da du deinen File-Stream nie aus dem Speicher gekehrt hast. Heißt auch, dass die Datei noch offen war. Falls dich noch ein wenig die Dateisicherheit interessiert, guck doch mal nach folgendem:
Code:
Bernhard
fmShareExclusive Kein Lese- und Schreibzugriff.
fmShareDenyWrite Kein Schreibzugriff. fmShareDenyRead Kein Lesezugriff. Verwenden Sie diesen Modus nicht in plattformübergreifenden Anwendungen. fmShareDenyNone Andere haben uneingeschränkten Zugriff. |
Re: jpeg in FileStream speichern
Dankeschön! Das werde ich gleich mal ausprobieren;)
Allerdings muss ich zu meiner Verteidigung sagen: Zitat:
lg Daniel |
Re: jpeg in FileStream speichern
Es passiert immer noch nichts :( Das jpeg wird nicht in den Stream geschrieben.
hier noch einmal der komplette code, falls irgendwo anders ein doofer fehler ist, der das verursacht. ich schreibe am anfang einen hashwert eines passworts in die datei. dieser wert wird geschrieben. Dann möchte ich aus einer liste (mmFiles = Memo) dateien laden und in den stream schreiben. Ich hab im debug überprüft, ob er auch brav alle schritte ausführt. und das tut er. aber trotzdem wird nichts in die datei geschrieben..
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtDlgs, ExtCtrls, JPEG, MD5; procedure TForm2.Button1Click(Sender: TObject); var Datei : TFileStream; passwort : String; Context : TMD5_CTX; Hash : TMD5Digest; // 16 Bytes in einem Array 0-15 i : Integer; jpeg : TJpegImage; bild : TPicture; begin // Datei erstellen Datei := TFileStream.Create(Savedialog1.FileName,fmCreate); // Passwort Hash ermitteln passwort := edPasswort.Text; MD5Init(Context); MD5Update(Context, pChar(passwort), Length(passwort)); MD5Final(Context, Hash); // Passwort schreiben Datei.Write(Hash[0],16); // Bilder schreiben For i := 0 to mmFiles.Lines.Count -1 do begin if not fileexists(mmFiles.Lines[i]) then continue; // Bild laden jpeg := TJpegImage.Create; jpeg.CompressionQuality := 90; Bild := TPicture.Create; Bild.LoadFromFile(mmFiles.Lines[i]); jpeg.Assign(Bild.Graphic); Bild.Free; jpeg.Compress; // Kompriemieren // in Stream schreiben jpeg.SaveToStream(datei); jpeg.Free; end; Datei.Free; end; |
Re: jpeg in FileStream speichern
hoi,
funzt es wenn du statt
Delphi-Quellcode:
das verwendest
Bild.LoadFromFile(mmFiles.Lines[i]);
Delphi-Quellcode:
?
Bild.Bitmap.LoadFromFile(mmFiles.Lines[i]);
und beim speichern eben
Delphi-Quellcode:
cya
jpeg.Assign(Bild.Bitmap);
|
Re: jpeg in FileStream speichern
aber dann kann ich als quelle doch nur bitmaps verwenden oder nicht? hauptsächlich möchte ich aber jpegs verwenden..
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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