Hi Tommi,<br>Habe das Sample Projekt erweitert. Lade es nochmal. Der Pfad ist allerdings auf 255 Zeichen beschränkt! Mann sollte hier auch ein anderes Format einführen wie: <LÄNGE PFAD><PFAD><br>Ansonsten würdest du auch 255 Byte verwenden, wenn das File nur "c:\Test.jpg" heisst.<br>cu Michae
Announcement
Collapse
No announcement yet.
Dateien aneinanderhängen
Collapse
X
-
Hi, nochmal der einigermassen bereinigte Code, falls jemand ähnliche Probleme mit TMemorystream hat.<br>
Auf der Form werden drei Button(BILD_VON_FILE_LADEN, BILD_VON_IMAGE_LADEN, VORSCHAU) benötigt, ein TImage(Image1) in Scrollbox und zwei Images(Image3, Image4 mit Bildinhalt). Ich habe in diesem Beispiel nicht alles über Exceptions abgefangen was nötig wäre! Es soll lediglich ein Working Sample sein!
<PRE>
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, jpeg;
type
TFileStream = class(TForm)
BILD_VON_FILE_LADEN: TButton;
VORSCHAU: TButton;
ScrollBox1: TScrollBox;
Image1: TImage;
Image3: TImage;
Image4: TImage;
BILD_VON_IMAGE_LADEN: TButton;
Label1: TLabel;
procedure BILD_VON_FILE_LADENClick(Sender: TObject);
procedure VORSCHAUClick(Sender: TObject);
procedure BILD_VON_IMAGE_LADENClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
FileStream: TFileStream;
implementation
{$R *.DFM}
procedure TFileStream.BILD_VON_FILE_LADENClick(Sender: TObject);
var
IN_Stream : TMemorystream;
OUT_Stream : TMemorystream;
x : integer;
Fileliste : TStringlist;
Filesize_array : array[0..10] of char;
Filepath_array : array[0..256] of char;
Imagesize, Filesize : integer;
begin
Fileliste := TStringlist.Create;
IN_Stream := TMemorystream.Create;
OUT_Stream := TMemorystream.Create;
fileliste.add('Bild1.jpg');
fileliste.add('Bild2.jpg');
OUT_Stream.clear;
for x := 0 to fileliste.count - 1 do begin
// IN_Stream wird durch das Laden des File in seiner Größe automatisch neu gesetzt!
IN_Stream.loadfromfile(extractfiledir(application. exename) + '\' + fileliste[x]);
IN_Stream.Seek(0, 0);
// Schreibe 10 Byte Länge des folgenden Bildes
Imagesize := IN_Stream.Size;
fillchar(Filesize_array, sizeof(Filesize_array), '0');
StrPCopy(Filesize_array, format('%0.10d',[Imagesize]));
OUT_Stream.writebuffer(Filesize_array, 10);
// Schreibe 10 Byte Länge des Pfades des folgenden Bildes
Filesize := length(extractfiledir(application.exename) + '\' + fileliste[x]);
fillchar(Filesize_array, sizeof(Filesize_array), '0');
StrPCopy(Filesize_array, format('%0.10d',[Filesize]) );
OUT_Stream.writebuffer(Filesize_array, 10);
// Schreibe Pfad des folgenden Bildes
fillchar(Filepath_array, sizeof(Filepath_array), ' ');
StrPCopy(Filepath_array, (extractfiledir(application.exename) + '\' + fileliste[x]));
OUT_Stream.writebuffer(Filepath_array, Filesize);
// Bilddaten schreiben
OUT_Stream.copyfrom(IN_Stream, Imagesize );
end;
try
OUT_Stream.SaveToFile(extractfiledir(application.e xename) + '\AusgabeStream');
except
on E: Exception do Showmessage(E.Message);
end;
Fileliste.free;
IN_Stream.free;
OUT_Stream.free;
end;
procedure TFileStream.VORSCHAUClick(Sender: TObject);
var
IN_Stream : TMemorystream;
Bild_Stream : TMemorystream;
Image2 : TImage;
dir : string;
Bild : TJpegImage;
count: integer;
Preview_box, top, left, right, bottom : integer;
scale : real;
Filesize_array : array[0..9] of char;
Filepath_array : array[0..256] of char;
Imagesize, Filesize : string;
begin
Preview_box := 150; // Grösse der Bildansicht, quadratisch
dir := extractfiledir(application.exename);
IN_Stream := TMemorystream.Create;
Bild_Stream := TMemorystream.Create;
Image2 := TImage.create(self);
image2.Stretch := false;
image2.AutoSize := true;
Bild := TJPegImage.Create;
IN_Stream.LoadFromFile(dir + '\AusgabeStream');
IN_Stream.position := 0;
count := 0;
image1.picture := NIL;
image1.Canvas.Pen.Color := clBlack;
while IN_Stream.Position < IN_Stream.Size do begin
// *** LESEN HEADER INFO's ***
fillchar(Filesize_array, sizeof(Filesize_array), '0');
fillchar(Filepath_array, sizeof(Filepath_array), ' ');
// 10 Byte Imagesize
IN_Stream.Readbuffer(Filesize_array, 10);
Imagesize := Filesize_array;
// 10 Byte Pfadlänge
IN_Stream.Readbuffer(Filesize_array, 10);
Filesize := Filesize_array;
// Pfad
IN_Stream.Readbuffer(Filepath_array, strtoint(Filesize_array));
// Bild
Bild_Stream.Clear;
Bild_Stream.CopyFrom(IN_Stream , strtoint(Imagesize));
Bild_Stream.Seek(0, 0);
Bild.LoadFromStream(Bild_Stream);
// *** AUSGABE BILD ***
// bild.SaveToFile('Test'+inttostr(count)+'.jpg');
image2.picture.assign(bild);
image1.picture.Bitmap.Height := ((count + 1) * Preview_box) + ((count + 1) * 20);
left := 10;
top := (count * Preview_box) + ((count + 1) * 20);
right := Preview_box + 10;
bottom := ((count + 1) * Preview_box) + ((count + 1) * 20);
image1.Canvas.Rectangle(rect( left, top, right, bottom));
image1.canvas.Font.Name := 'Arial';
image1.canvas.Font.size := 7;
image1.canvas.TextOut(15, (count * Preview_box) + ((count + 1) * 20) - 20,'Bildgrösse: '+ inttostr(strtoint(Imagesize)) + 'Byte');
image1.canvas.TextOut(15, (count * Preview_box) + ((count + 1) * 20) - 11,'Bildpfad: '+ trim(Filepath_array));
if image2.Width > image2.Height then
scale := Preview_box /image2.Width
else
scale := Preview_box / image2.height;
image1.Canvas.StretchDraw(rect( left + 2,
top + 2,
left + trunc(image2.Width * scale) - 4,
top + trunc(image2.height * scale) - 4
),
image2.Picture.graphic);
inc(count,1);
scrollbox1.VertScrollBar.Range := (count * Preview_box) + ((count + 1) * 20);
end;
Bild.free;
IN_Stream.free;
Bild_Stream.free;
image2.free;
end;
procedure TFileStream.BILD_VON_IMAGE_LADENClick(Sender: TObject);
var
IN_Stream : TMemorystream;
OUT_Stream : TMemorystream;
Filesize_array : array[0..10] of char;
Filepath_array : array[0..256] of char;
dir : string;
x : integer;
Imagesize, Filesize : integer;
Fileliste : TStringlist;
Bild : string;
begin
dir := extractfiledir(application.exename);
IN_Stream := TMemorystream.Create;
OUT_Stream := TMemorystream.Create;
// OUT_Stream für Daten vorbereiten
OUT_Stream.clear;
// Hier Images festlegen
Fileliste := TStringlist.Create;
Fileliste.add('Image3');
Fileliste.add('Image4');
for x := 0 to Fileliste.count - 1 do begin
if Fileliste[x] <> '' then begin
IN_Stream.Clear;
fillchar(Filesize_array, sizeof(Filesize_array), '0');
fillchar(Filepath_array, sizeof(Filepath_array), ' ');
Bild := 'Intern ' + Fileliste[x];
// x-tes Bild in Stream verfrachten
((findcomponent(Fileliste[x])) as TImage).Picture.Graphic.SaveToStream(IN_Stream);
IN_Stream.Seek(0, 0);
// Schreibe 10 Byte Länge des folgenden Bildes
Imagesize := IN_Stream.Size;
StrPCopy(Filesize_array, format('%0.10d',[Imagesize]));
OUT_Stream.writebuffer(Filesize_array, 10);
// Schreibe 10 Byte Länge des Pfades des folgenden Bildes
Filesize := length(Bild);
StrPCopy(Filesize_array, format('%0.10d',[Filesize]));
OUT_Stream.writebuffer(Filesize_array, 10);
// Schreibe 255 Byte Pfad des folgenden Bildes
StrPCopy(Filepath_array, Bild);
OUT_Stream.writebuffer(Filepath_array, Filesize);
// bilddaten schreiben
OUT_Stream.copyfrom(IN_Stream, IN_Stream.Size );
end;
end;
try
OUT_Stream.SaveToFile(dir + '\AusgabeStream');
except
on E: Exception do Showmessage(E.Message);
end;
IN_Stream.free;
OUT_Stream.free;
Fileliste.free;
end;
end.
</PRE><br>wem's hilft ;-) Michae
Comment
Comment