TBitmap到TPngImage和内存使用情况

时间:2013-04-25 16:03:07

标签: delphi memory tbitmap

我有一个11个白色TBitmap(32位512x512像素= 1 MB)的数组 我想将它们分配给TPngImage数组以减少内存使用, 我希望1 mb白色位图变为1.76 KB png并且内存使用率急剧下降 我用任务管理器监控它,差异只有0.824 MB,为什么会这样?什么是在内存中无损压缩TBitmaps的最佳/最快方法?


for I := 0 to 10 do
begin
  Bitmaps[I] := TBitmap.Create;
  Bitmaps[I].PixelFormat := pf32bit;
  Bitmaps[I].Canvas.Pen.Color := clWhite;
  Bitmaps[I].SetSize(512,512);
  Bitmaps[I].Canvas.Rectangle(0,0,512,512);
end;

for I := 0 to 10 do begin Pngs[I] := TPngImage.Create; Pngs[I].Assign(Bitmaps[I]); Bitmaps[I].Free; end;


更新

表单@bummi研究我认为最好的办法是将png保存在内存流数组中,这相差9.7 MB。


for I := 0 to 10 do
begin
  Png :=  TPngImage.Create;
  Png.Assign(Bitmaps[I]);
  Streams[I] := TMemoryStream.Create;
  Png.SaveToStream(Streams[I]);
  Bitmaps[I].Free;
  Png.Free;
end;

2 个答案:

答案 0 :(得分:1)

当您发布TBitmap时,您发布了两件事:

  • 内存到FastMM4 Delphi堆管理器
  • HBITMAP Windows GDI句柄

如果你最小化所有程序的窗口然后恢复它们,Windows有时会缩小工作集,但是它没有被授予。由于今天相对较小的10MB差异而重新安排进程内存不会减慢任何速度。

https://stackoverflow.com/a/14380287/976391

处的回答开始阅读更多内容

http://fastmm.sourceforge.net/附带自述文件和演示如何测量进程内的内存使用情况,如果它让你好奇。

但是如果你真的想减少RAM使用量 - 那么就不要分配它。只需制作一个TBitmap并从中分配al PNG。尽管如此,你的寡妇仍明确表示10MB不是值得关注的数字。


另外,正如user539848发现的那样,你有11个位图,而不是10个。为了避免一个一个错误,你最好不要使用神奇的常量,而是使用可靠的编译器结构。

for I := Low(Bitmaps) to High(Bitmaps) do
begin
  Bitmaps[I] :=...

答案 1 :(得分:0)

TPngImage保持所有像素准备就绪并解压缩,以便能够快速消除它们。 TPngImage占用与TBitmap大致相同的内存量。

因此,只需将位图分配给TPngImage就可以复制数据。因此,在释放位图后,程序将最终使用相同数量的内存。

如果您希望内存使用率降至1.76 KB png,则必须将PNG压缩为内存流并释放TPngImage,就像更新中的代码一样。