Einzelnen Beitrag anzeigen

Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#1

Effizientere Umsetzung gesucht: Datei mit Header und JPG

  Alt 10. Aug 2004, 15:45
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.
  Mit Zitat antworten Zitat