Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Probleme mit Streams (https://www.delphipraxis.net/9514-probleme-mit-streams.html)

Legolas 28. Sep 2003 11:24


Probleme mit Streams
 
Hallo alle zusammen,

ich nehme heute das erste mal aktiv an eurem Forum teil :-D und hoffe die richtige Sparte erwischt zu haben. Da es um JPEG-Dateien geht, denke ich das schon. Nun zu meinem Problem:

Ich habe ein JPEG-Bild das ich mit einer Routine in der Größe verkleinern und komprimieren möchte. Dafür habe ich mich einiger Beiträge aus diesem Forum bedient. Folgenden Code habe ich erstellt:

Delphi-Quellcode:

procedure StoreJPEGImage(Table: TTable; Field: STRING);
var s : TBlobStream;
    fs: TFileStream;
    ms: TMemoryStream;
    bmp : TBitmap;
    jpeg: TJPEGImage;
begin
  bmp := tbitmap.create;
  jpeg := tjpegimage.create;
  fs := TFileStream.Create(Haupt.CoverDialog.FileName, fmOpenRead);
  s := TBlobStream.create(Table.FieldByName(Field) AS TBlobField, bmWrite);
  ms:=TMemoryStream.Create;
  try
    jpeg.LoadFromStream(fs);
    bmp.assign(jpeg);
    If jpeg.width>jpeg.Height then
    begin
      bmp.width:=400;
      bmp.height:=250;
    end else
    begin
      bmp.width:=250;
      bmp.Height:=400;
    end;
    jpeg.compressionquality := 50;
    jpeg.assign(bmp);
    jpeg.SaveToStream(ms);
    ms.
  finally
    bmp.free;
    jpeg.free
  end;
  [color=#ff0024]s.CopyFrom(ms, ms.Size);[/color] <-- HIER ENTSTEHT EINE EXCEPTION DER KLASSE EReadError AUF.
  fs.free;                                           MELDUNG: Stream-Lesefehler !!!
  s.Free;
end;
Wie Ihr sehen könnt versuche ich einen TBlobStream in einen TMemoryStream zu kopieren. Aber anscheinend funktioniert das nicht so, oder?

Wo habe ich da einen Fehler gemacht und wer kann mir einen entscheidenden Tip geben.

Gruß Legolas

sakura 28. Sep 2003 11:26

Re: Probleme mit Streams
 
Füge mal direkt vor der Problemzeile folgende Zeile ein.
Delphi-Quellcode:
ms.Position := 0;
...:cat:...

Daniel B 28. Sep 2003 11:55

Re: Probleme mit Streams
 
Hallo und herzlich Willkommen in der DP!
Zitat:

Zitat von Legolas
Delphi-Quellcode:
    ms.
  finally

WAs fehlt denn da noch hinter dem ms.?

Legolas 28. Sep 2003 22:32

Re: Probleme mit Streams
 
Hallo,

@Daniel B:

Das ms. habe ich nur zum testen ausprobiert. Hatte ich dann vergessen zu löschen. Hat also keinerlei Bedeutung.

@sakura:

Ich probiere deinen Vorschlag mal aus. Vielleicht hilft es was.

Grüße Legolas

Legolas 28. Sep 2003 22:54

Re: Probleme mit Streams
 
Hallo sakura,

prima :-D dein Tip hat mir geholfen. Allerdings muß ich gestehen das die Routine noch nicht so ganz ausgereift ist. Sie macht zwar was sie soll (JPEG komprimieren und in der Größe verkleinern) aber sie verkleinert das Bild nicht wirklich sondern zeigt (kopiert?) mir nur einen Bildausschnitt in der Größe die ich angegeben habe (400x250) ausgehend von der oberen rechten Bildecke.

Das ist natürlich nicht der Sinn und Zweck dieser Routine. Ich wollte schon das ganze Bild haben.

Naja, werde nochmal ein bisschen weitertüfteln.

Ich melde mich nochmal wenn ich es gelöst habe. Sollte jemand Interesse an der Routine haben kann ich sie ja nachmal posten (wenn Sie fertig ist).


Grüße Legolas

Legolas 28. Sep 2003 23:25

Re: Probleme mit Streams
 
Soooooooooooooo, :-D

an alle die Interesse daran haben, diese Procedure ist jetzt voll funktionstüchtig und tut das was sie soll:

Delphi-Quellcode:
procedure StoreJPEGImage(Table: TTable; Field: STRING);
var s : TBlobStream;
    fs: TFileStream;
    ms: TMemoryStream;
    bmp : TBitmap;
    jpeg: TJPEGImage;
begin
  bmp := tbitmap.create;
  jpeg := tjpegimage.create;
  fs := TFileStream.Create(Haupt.CoverDialog.FileName, fmOpenRead);
  s := TBlobStream.create(Table.FieldByName(Field) AS TBlobField, bmWrite);
  ms:=TMemoryStream.Create;
  try
    jpeg.LoadFromStream(fs);
    bmp.assign(jpeg);
    If jpeg.width>jpeg.Height then
    begin
      bmp.width:=400;
      bmp.height:=250;
    end else
    begin
      bmp.width:=250;
      bmp.Height:=400;
    end;
    bmp.canvas.StretchDraw(Rect(0,0,bmp.width,bmp.height),jpeg);
    jpeg.compressionquality := 50;
    jpeg.assign(bmp);
    jpeg.SaveToStream(ms);
  finally
    bmp.free;
    jpeg.free
  end;
  ms.Position:=0;
  s.CopyFrom(ms, ms.Size);
  fs.free;
  s.Free;
end;
Da ich sie speziell an meine Bedürfnisse angepasst und in einer seperaten Unit ausgelagert habe muß sie natürlich noch an gewissen Punkten angepasst werden.

Wer Verbesserungvorschläge in Bezug auf Geschwindigkeit und Optimierung (oder sonstige Ideen) hat kann sie hier gerne Vorstellen.

Grüße Legolas


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 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