![](/img/trans.png)
[英]How can convert FMX.Graphics.TBitmap to VCL.Graphics.TBitmap or Vcl.Imaging.PngImage.TPngImage?
[英]TBitmap to TPngImage and Memory usage
我有一個11個白色TBitmaps(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;
當您發布TBitmap時,您發布了兩件事:
有時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] :=...
TPngImage保持所有像素准備就緒並解壓縮,以便能夠快速消除它們。 TPngImage占用的內存大小與TBitmap大致相同。
因此,只需將位圖分配給TPngImage就可以復制數據。 因此,在釋放位圖后,程序將最終使用相同數量的內存。
如果您希望內存使用率降至1.76 KB png,則必須將PNG壓縮為內存流並釋放TPngImage,如更新中的代碼所示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.