Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi jpeg in FileStream speichern (https://www.delphipraxis.net/132249-jpeg-filestream-speichern.html)

Hyperspacer 8. Apr 2009 17:12


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:
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;
Liebe Grüße
Daniel

sirius 8. Apr 2009 17:19

Re: jpeg in FileStream speichern
 
Ist die Datei schon vorhanden? Ansonsten müsstest du anstatt fmOpenWrite -->fmCreate verwenden.

Und hat jpeg keine SaveToFile-Methode?

rollstuhlfahrer 8. Apr 2009 19:34

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:
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;
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).
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:
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.
Bernhard

Hyperspacer 9. Apr 2009 13:11

Re: jpeg in FileStream speichern
 
Dankeschön! Das werde ich gleich mal ausprobieren;)

Allerdings muss ich zu meiner Verteidigung sagen:
Zitat:

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

dass ich das gemacht habe. Ich habs hier nur nicht mehr mit gepostet. Aber dem aufmerksamen leser fällt das natürlich sofort auf :thumb:

lg
Daniel

Hyperspacer 9. Apr 2009 13:25

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;

soulies 9. Apr 2009 14:09

Re: jpeg in FileStream speichern
 
hoi,

funzt es wenn du statt
Delphi-Quellcode:
Bild.LoadFromFile(mmFiles.Lines[i]);
das verwendest
Delphi-Quellcode:
Bild.Bitmap.LoadFromFile(mmFiles.Lines[i]);
?

und beim speichern eben
Delphi-Quellcode:
jpeg.Assign(Bild.Bitmap);
cya

Hyperspacer 9. Apr 2009 14:22

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 22:59 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