Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Effizientere Umsetzung gesucht: Datei mit Header und JPG (https://www.delphipraxis.net/27457-effizientere-umsetzung-gesucht-datei-mit-header-und-jpg.html)

Dannyboy 10. Aug 2004 14:45


Effizientere Umsetzung gesucht: Datei mit Header und JPG
 
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.

franktron 10. Aug 2004 15:59

Re: Effizientere Umsetzung gesucht: Datei mit Header und JPG
 
Schon mal versucht j.saveToStream :wink:

Dannyboy 12. Aug 2004 12:47

Re: Effizientere Umsetzung gesucht: Datei mit Header und JPG
 
Zitat:

Zitat von franktron
Schon mal versucht j.saveToStream :wink:

Das Speichern des JPGS in einem Stream wäre nicht das Problem, wenn ich
wüsste, wie ich die Nicht-JPG-Daten dort anhänge, das JPG hinten dran und dann das
ganze Paket in eine Datei speichere.


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