Delphi FMX正确加载图片最大限度减少内存占用(之二TImageList)

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

      2、《Delphi处理高速文件上传下载的代码及思路》

      https://blog.csdn.net/pulledup/article/details/108660481

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

猜你喜欢

转载自blog.csdn.net/pulledup/article/details/108979086
今日推荐