【发布时间】:2012-12-16 02:50:09
【问题描述】:
我已经搜索和搜索,似乎无法找到任何描述我希望在 delphi 代码中执行的操作。溶液有时很接近,但不够接近,我无法弄清楚。所以我在这里问..
我有许多位图,我正在从屏幕截图中提取。我一直在做的是保存到bitmaps_001.bmp,但是它需要很多存储空间,所以我升级了例程以保存为bitmaps_001.png,这样可以节省更多的空间,但是现在我想保存到一个文件中,一个 tfilestream,并使用 tprogressbar 从中读取,我可以在屏幕上显示图像时向左/向右拖动。
基本上,我正在尝试完成以下操作:
procedure SaveBMPtoStream(st: tfilestream; bmp: tbitmap);
procedure ReadBMPfrStream(st: tfilestream; bmp: tbitmap; bnum: integer);
到目前为止,代码(如下)按原样工作,(它在按下 t 按钮时写入和读取一个位图图像)但我只能写入一个位图图像。我需要将每个会话所需的尽可能多的图像实时写入 tfilestream,可能使用 ttimer 控件并让它写入尽可能多的图像,直到我按下停止按钮。我该怎么做才能修改下面的代码来解决这个问题?谢谢。
我正在运行 windows xp,连接到带有 NTFS 文件系统的外部 usb3.0 1tb 驱动器。
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;
【问题讨论】:
-
您遇到了一些复制/粘贴错误 (?),
like type TMS: TFileStream;。 ;) 如果信息不必在会话中保留,您可以保留一个单独的位图编号索引 - 流位置/大小并将该部分复制到临时流中以供读取。否则,您可以从流中读取位图信息标头以将流推进到请求的索引,然后再次复制,或者在应用程序开始时以相同的方式构建索引。但后者的工作量更大。 -
哦,那是一个错字。现在更正了。谢谢。
-
您在哪里看到 (//sz:=MS.Size; pos:=ms.Position;) 我在尝试时正在研究各个地方的部分代码 sn-ps。这一切都让我感到困惑,我似乎无法弄清楚。它在我头上,但我需要弄清楚这一切,所以几个月后我仍然在做。这就是为什么我来这里,以获得答案。但仍然没有。所以,我会继续寻找。感谢您的尝试。
-
我刚刚意识到我遗漏了一些东西(关于图像),也许这可能会帮助我得到一些答案。图像尺寸相同,300x300 像素。但尺寸可能会在运行时发生变化。前几天晚上,我用超过 6 万张 png 图像填充了一个文件夹。它导致我的硬盘锁定。我可以减少到大约 4 万张图像,但文件夹需要很长时间才能让我看到文件。这就是为什么我认为走 tfilestream 路线是最好的,因为我将写入一个文件。
-
听起来你真正想做的是record the screen。如果这就是你的程序所能做的,那么不要费心编写你自己的程序。只需使用一个off the shelf。
标签: delphi bitmap tfilestream