schreiben/Lesen von bitmaps zu einem tfilestream

habe ich gesucht und gesucht und kann nicht scheinen, nichts zu finden, der beschreibt, was ich bin Aussehen zu tun, im delphi-code. die solutins sind manchmal nah, aber nicht nah genug für mich, um herauszufinden. so hier bin ich gefragt..

ich habe viele bitmaps, ich bin retreaving von screenshots. was ich Tue ist zu speichern, um bitmaps_001.bmp, aber es braucht eine Menge Speicherplatz, so dass ich aktualisiert die routine zum speichern als bitmaps_001.png-und das spart noch mehr Platz, aber jetzt will ich speichern, um eine Datei, ein tfilestream, und Lesen Sie von es mit eine tprogressbar, die ich ziehen kann, Links/rechts, wie die Bilder zeigen auf dem Bildschirm.

grundsätzlich bin ich versucht zu acomplish die folgenden:

procedure SaveBMPtoStream(st: tfilestream; bmp: tbitmap);
procedure ReadBMPfrStream(st: tfilestream; bmp: tbitmap; bnum: integer);

bisher den code (unten)arbeitet als ist, (er schreibt und liest in einem bitmap-Bild, bei der Pressekonferenz einen tbutton), aber ich kann nur schreiben, ein bitmap-Bild. muss ich schreiben, so viele Bilder wie nötig pro Sitzung auf der tfilestream in Echtzeit, evtl. mit einer ttimer Kontrolle und lassen Sie es schreiben so viele Bilder, bis ich "Stopp" drücken tbutton. was kann ich tun, ändern Sie den code unten, um dieses Problem zu lösen? danke.

ich bin mit windows xp, an externe usb3.0 1-TB-Platte mit NTFS-Dateisystem.

type
  TMS = TFileStream; 
var
  MS:  TMS; 
  pos: int64;   // bnum for 0-99,999 images.
  sz:  integer; // size of the image/stream ?

//write bitmaps to stream
procedure SaveBMPtoStream(ms: TMS; Bmp: TBitmap; bnum: integer);
begin
  // create (or append to) stream
  if fileexists('d:\streams\s.stm') then MS := TFileStream.Create('d:\streams\s.stm', fmOpenReadWrite)
    else MS := TFileStream.Create('d:\streams\s.stm', fmCreate);
  //sz:=MS.Size; pos:=ms.Position;
  bmp.SaveToStream(MS); 
  // free stream
  ms.free;
end;

//read bitmaps from stream
procedure ReadBMPfrStream(ms: TMS; Bmp: TBitmap; bnum: integer);
begin
  // open stream.
  MS := TFileStream.Create ('d:\streams\s.stm', fmOpenReadWrite); 
  // read in bitmap from stream
  //sz:=MS.Size; pos:=ms.Position;
  bmp.LoadFromStream(MS);
  // free stream
  ms.free;
end;
  • Hast du noch ein paar copy/paste-Fehler (?), like type TMS: TFileStream;. 😉 Wenn die Informationen nicht haben, um zu beharren in Sitzungen, Sie können wahrscheinlich halten Sie einen separaten index, der die bitmap-Nummer - stream-position/Größe, und kopieren Sie diesen Teil in eine temporäre stream zum Lesen. Andernfalls können Sie Lesen, bitmap-info-Header aus dem stream, um vorab den stream, bis der angeforderte index und kopieren Sie dann erneut, oder erstellen Sie einen index auf die gleiche Weise in den start der Anwendung. Aber das letztere wäre mehr Arbeit.
  • oh, das war ein Tippfehler. korrigiert jetzt. danke.
  • wo sehen Sie (//sz:=MS. Größe; pos:=ms.Position;) ich wurde untersucht, teilen von code-snippets in verschiedenen Orten, während Sie auszuprobieren. das ist alles verwirrend für mich und ich kann nicht scheinen, um es herauszufinden. seine über meinem Kopf, aber ich muss alles ausrechnen, also ich bin immer noch bei ihm, Monate später. das ist, warum ich kam hier erhalten Sie die Antworten. aber noch keiner. so, ich werde weiter suchen. vielen Dank für den Versuch.
  • Ich erkannte, dass ich etwas ausgelassen (zu den Bildern) und vielleicht könnte mir dabei helfen, einige Antworten. die Bilder sind die gleichen Abmessungen 300 x 300 Pixel. aber die dimension kann sich zur Laufzeit ändern. der andere Abend, ich fülle einen Ordner mit über 60 tausend png-Bilder. es bewirkt, dass meine hdd zu sperren. ich kann mich an vielleicht 40 thousdand Bilder, aber es dauert eine lange Zeit für den Ordner, um mir die Dateien anzuzeigen. das ist, warum ich denke, dass geht den tfilestream route ist die beste, seit ich das schreiben in eine Datei.
  • Es klingt wie das, was Sie wirklich versuchen zu tun ist notieren Sie den Bildschirm. Wenn Ihr Programm tun wird, und dann nicht die Mühe, schreiben Ihre eigenen. Verwenden Sie einfach eine von der Stange.
  • danke, Rob. ich bin mir bewusst von Ihnen. aber keine Antwort auf meine Frage, wie code meiner eigenen routine für das schreiben von mehreren bitmaps zu einem tfilestream.
  • was u wollen, ist TAR-Datei-format und Google oder torry.net/pages.php?id=302 zeigt eine Reihe von Beispielen von TEER in delphi. Aber warum denken Sie, würden Sie sparen viel Speicherplatz als die Speicherung von PNGs als separate Dateien ?
  • Arioch, bitmaps sind sehr groß und durch R/G/B-Größe, - und jpeg-selbst bei 100% Komprimierung zeigt zu viel, deutliche pixel - /Kompressions-Artefakte. Die alternative ist png, kleiner als bitmap-und verlustfreier Qualität. Ich bin mir nicht bewusst, TEER, geschweige denn, wenn delphi 6 hat eine Komponente/unit, die für Sie (nur bewusst tjpeg und pngunit). Speichern von Dateien braucht mehr Zeit, Ressourcen und Festplattenspeicher. Die Lösung ist eine einzelne Datei-stream, und die letzten, die ich brauchte, das wissen über tfilestream und mehrere bitmaps, da konnte ich nicht finden, eine tatsächliche funktionierende Beispiele überall. Und danke an bummi für die Versorgung der ersten Beispiele.
  • Mit JPEG(eingeführt für Natürliche photoshots) für screenshots ist, wie integral-Berechnungen über text-strings. Screenshots zu machen andere archivers eingeführt wurden, wie veraltete GIF und PNG. Ich Frage mich, wenn Sie sparen können Sie Bildschirm in animierte PNG 🙂
  • TAR ist eine bekannte standard-Dateiformat für das speichern der Vielzahl von Dateien ohne Kompression. Wenn die Komprimierung benötigt wird - es wird über die daraus resultierende TAR. So könnte es Ihre Bedürfnisse anzupassen (obwohl Sie NIH). Was ist mit den code - vor allem die spped des Codes -, die ich oben erwähnt mindestens zwei Seiten, wo u können versuchen, zu finden fertige Implementierungen von TAR für Delphi. Was ist mit PNG-Kompressoren gibt es eine Reihe von Delphi-Wrapper, mit wahrscheinlich unterschiedlichen Geschwindigkeiten sowie. BTW VCL TBitmap basiert auf der Windows-GDI-kernel, so wäre nicht eh schnell.

InformationsquelleAutor johnm2 | 2012-12-16
Schreibe einen Kommentar