Delphi FMX正确加载图片最大限度减少内存占用(之二TImageList)
继上篇《Delphi FMX正确加载图片最大限度减少内存占用(之一TBitmapSurface)》之后,我们继续优化内存,本片谈谈FMX TImageList加载标清大图。
过去,我们在用TImageList加载小图标时,一般不会注意内存消耗的问题,过去在VCL编程时更不会关心这些问题,只管往前冲。可是,当在FMX下,用TImageList加载大量的标清左右像素大小的动态图片作为选单时(比如:593px*593px),你会发现,如果按照常规用法提取图片资源的Bitmap,内存的资源消耗是代价很大的。
一、错误的做法
1.1、错误的做法1:(同上篇)
//错误做法1:TImage.Bitmap.LoadFromStream 或 TImage.Bitmap.LoadFromFile
//内存流太吃内存了,特别又是循环中:
// 创建流,用流来转换图片,实际应用时可直接将图片处理成流来应用
index :=0; num :=8;
//...................
s.cx := 96; s.cy := 96;//:屏幕的点阵,非像素:设置为Image的宽高
for i := index to num + index - 1 do
begin
//...............................
TS := TMemoryStream.Create;
//加载TImageList中的图标
ilMainImage.Bitmap(s, i).SaveToStream(TS); // 生成流数据
TS.Position := 0;
Image.Bitmap.LoadFromStream(TS); //:流数据载入 Image
TS.DisposeOf;
//...............................
end;
1.2、错误的做法2:
index :=0; num :=8;
//...................
s.cx := 96; s.cy := 96;//:屏幕的点阵,非像素:设置为Image的宽高
for i := index to num + index - 1 do
begin
//...............................
Image.Bitmap.Assign( ilMainImage.Bitmap( s,i ) );//:94个图片能节省23M内存后:但也大
//...............................
end;
1.3、错误的做法3:
index :=0; num :=8;
//...................
s.cx := 96; s.cy := 96;//:屏幕的点阵,非像素:设置为Image的宽高
for i := index to num + index - 1 do
begin
//...............................
LBitmapSurface :=TBitmapSurface.Create;//:创建客制化位图界面
LBitmapCodec :=TBitmapCodecManager.Create;
try
LBitmapSurface.SetSize(96,96);
LBitmapCodec.LoadFromFile(
ilMainImage.Source[i].MultiResBitmap[0].FileName,//:FileName已含路径
LBitmapSurface, 96 );
Image.Bitmap.Assign( LBitmapSurface );
finally
LBitmapSurface.DisPoseOf; LBitmapCodec.DisPoseOf;
end;
//...............................
end;
二、正确使用TImageList加载其中图片的Bitmap到Image的做法
index :=0; num :=8;
//...................
s.cx := 96; s.cy := 96;//:屏幕的点阵,非像素:设置为Image的宽高
for i := index to num + index - 1 do
begin
//...............................
//ilMainImage.ClearCache(i);//:占用2M内存
//(ilMainImage.Destination[i].Layers[0].MultiResBitmap[0].Bitmap ).Width:=96;//:无需
//(ilMainImage.Destination[i].Layers[0].MultiResBitmap[0].Bitmap ).Height:=96;//:无需
(ilMainImage.Destination[i].Layers[0].MultiResBitmap[0].Bitmap ).Assign( ilMainImage.Bitmap( s,i ) );
Image.Bitmap.Assign( ilMainImage.Destination[i].Layers[0].MultiResBitmap[0].Bitmap );
//ilMainImage.Bitmap( s,i ).FreeHandle; //:占用5M内存
//...............................
end;
本博客相关博文:
1、《Delphi FMX正确加载图片最大限度减少内存占用(之一TBitmapSurface)》
https://blog.csdn.net/pulledup/article/details/108935897
https://blog.csdn.net/pulledup/article/details/108660481
喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享: