Hallo SpriteFans,
meine folgende Klassenmethode soll den Record TCollectionInfo in
eine Datei schreiben und danach ein JPG an die Datei anhängen.
Das JPG wird zuvor aus einer TImage-Komponente geladen.
Die funktioniert alles wunderbar, allerdings leider nur über
einen Umweg:
Wie mein unten stehender Quelltext illustriert, habe ich dies
bisher nur über den Umweg einer temporären Datei hinbekommen.
Ich würde mich über einen Lösungsansatz ohne temporäre Datei
Sehr freuen. Habe das ganze auch über Streams versucht, aller –
dings bisher ohne Erfolg.
Besten Dank im Voraus
DANNYBOY
PS: Sorry, aber ich kommentiere immer in englisch.
„DecryptBuffer(buffer);“ bitte nicht beachten.
Delphi-Quellcode:
unit SpriteFiler;
interface
uses ExtCtrls, JPEG, Classes, SysUtils, Graphics;
//...
type TCollectionInfo =
record
matrixCellWidth : word;
matrixCellHeight : word;
lastSpriteNum : integer;
end;
TSpriteSaver =
class
public
class function SaveSpriteCollection(Image : TImage;
info : TCollectionInfo;
Filename :
String) : boolean;
end;
implementation
const buffersize = 1024;
type TBuffer =
array[1..buffersize-1]
of byte;
class function TSpriteSaver.SaveSpriteCollection;
const tempfile = '
temp.dat';
var j : TJPEGImage;
fIn, fOut : TFileStream;
buffer : TBuffer;
transmitted : integer;
begin
result:= true;
try
j:= TJPEGImage.Create;
// copy image to jpg and save it to tempfile on hard disk
j.Assign(image.Picture.Graphic);
j.SaveToFile(tempfile);
// save decrypted TCollectionInfo to file
move(info, Buffer, SizeOf(TCollectionInfo));
fOut:= TFileStream.Create(filename, fmCreate
OR fmShareExclusive);
DecryptBuffer(buffer);
fOut.
Write(buffer, SizeOf(TCollectionInfo));
// load jpg, encrypt it and append it to outputfile
fIn:= TFileStream.Create(tempfile, fmOpenRead
OR fmShareExclusive);
repeat
transmitted:= fIn.
Read(buffer, SizeOf(Buffer));
DecryptBuffer(buffer);
fOut.
Write(buffer, transmitted);
until transmitted = 0;
fOut.Free;
fIn.Free;
// delete temporary file
deletefile(tempfile);
except
result:= false;
end;
end;
end.