6

私は検索して検索しましたが、デルファイコードで何をしようとしているのかを説明するものが見つからないようです。ソルチンは時々近くにありますが、私が理解するのに十分なほど近くにはありません。だからここで私は尋ねています。

スクリーンショットから取得しているビットマップがたくさんあります。私がやっていることはbitmaps_001.bmpに保存することですが、それは多くのストレージスペースを必要とするので、bitmaps_001.pngとして保存するようにルーチンをアップグレードしました、そしてこれはさらに大きなスペースを節約します、しかし今私は1つのファイルに保存したいです、 tfilestreamを作成し、tprogressbarを使用して読み取ります。これは、画像が画面に表示されているときに左右にドラッグできます。

基本的に、私は次のことを達成しようとしています:

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

これまでのところ、コード(以下)はそのまま機能します(ボタンを押すだけで1つのビットマップイメージを読み書きします)が、私は1つのビットマップイメージしか書き込むことができません。セッションごとに必要な数の画像をリアルタイムでtfilestreamに書き込む必要があります。おそらく、ttimerコントロールを使用して、停止ボタンを押すまでできるだけ多くの画像を書き込むようにします。これを解決するために以下のコードを変更するにはどうすればよいですか?ありがとうございました。

NTFSファイルシステムを使用して外部usb3.01tbドライブに接続されたWindowsXPを実行しています。

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;
4

2 に答える 2

7
Function LoadBMPFromStream(const fn: String; Bmp: TBitmap; Nr: Integer):Boolean;
var // Nr is 0 based first Bitmap=0
  fs: TFileStream;
  ms: TMemoryStream;
  intNr: Integer;
  pos: Cardinal;
  size: DWord;
begin
  intNr := 0;
  if fileexists(fn) then
  begin
    Result := true;
    fs := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
    try
      fs.Read(size, SizeOf(DWord)); // Read Size of first Bitmap
      while (Nr > intNr) and (fs.Position < fs.size) do
      begin
        fs.Seek(size, soFromCurrent);
        fs.Read(size, SizeOf(DWord)); // Read Size of  Bitmap with intNr
        inc(intNr);
      end;
      if fs.Position < fs.size then
      begin
        ms := TMemoryStream.Create;
        try
          ms.CopyFrom(fs, size);
          ms.Position := 0;
          Bmp.LoadFromStream(ms);
        finally
          ms.Free;
        end;
      end
      else Result := false;
    finally
      fs.Free;
    end;

  end;
end;


procedure SaveBMPtoStream(const fn: String; Bmp: TBitmap);
var
  fs: TFileStream;
  ms: TMemoryStream;
  pos: Cardinal;
  size: DWord;
begin
  if fileexists(fn) then
  begin
    fs := TFileStream.Create(fn, fmOpenReadWrite or fmShareDenyNone);
    fs.Seek(0, soEnd);
  end
  else
  begin
    fs := TFileStream.Create(fn, fmCreate or fmShareDenyNone);
  end;
  try
    ms := TMemoryStream.Create;
    try
      Bmp.SaveToStream(ms);
      size := ms.size;
      ms.Position := 0;
      fs.Write(size, SizeOf(DWord)); // Write Size of next Bitmap first
      fs.CopyFrom(ms, size);
    finally
      ms.Free;
    end;
  finally
    fs.Free;
  end;

end;

procedure TForm6.Button2Click(Sender: TObject);
begin
  // load first Picture
  LoadBMPFromStream('C:\temp\test.str', Image3.picture.bitmap, 0);
  // load third picture
  // LoadBMPFromStream('C:\temp\test.str', Image3.picture.bitmap, 2);
end;

procedure TForm6.Button1Click(Sender: TObject);
begin
  SaveBMPtoStream('C:\temp\test.str', Image1.picture.bitmap);
  SaveBMPtoStream('C:\temp\test.str', Image2.picture.bitmap);
  SaveBMPtoStream('C:\temp\test.str', Image1.picture.bitmap);
end;
于 2012-12-16T08:04:02.463 に答える
0

すべての画像を同じファイルに保存しますか?最も簡単なオプションは、圧縮が0の7zipファイル(保存のみ)を使用することです。これにより、アーカイブからのファイルのインデックス作成/保存/取得を非常に簡単に管理できます。

これを実行できる優れた無料コンポーネントは次のとおりです。http ://www.rg-software.de/rg/index.php?option = com_content&view = article&id = 29&Itemid = 51

また、ビットマップのみをもう一度使用してみることもできますが、7zipで高速圧縮設定を使用すると、PNGよりも高速になる可能性があります。

于 2012-12-16T03:47:25.533 に答える