Delphi FMXは、メモリ使用量を最小限に抑えるために画像を正しくロードします(2つのTImageList)

Delphi FMXは、メモリ使用量を最小限に抑えるために画像を正しくロードします(2つのTImageList)

        前回の記事「DelphiFMXは、メモリ使用量を最小限に抑えるために画像を正しくロードします(TBitmapSurfaceの1つ)」の後、メモリの最適化を続けます。このビデオでは、SDラージイメージをロードするFMXTImageListについて説明します。

        以前は、TImageListを使用して小さなアイコンをロードするときは、通常、メモリ消費の問題に注意を払っていませんでした。以前は、VCLをプログラミングするときにこれらの問題を気にせず、急いで進んでいました。ただし、FMXでTImageListを使用して多数のSDの左右のピクセルサイズの動的画像をメニューとしてロードする場合(例:593px * 593px)、通常の使用法に従って画像リソースのビットマップを抽出すると、メモリリソースの消費量が価格になります。とても大きい。

        1.間違ったアプローチ

        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;

        2. TImageListを正しく使用して、画像のビットマップを画像にロードします

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. 「DelphiFMXは、メモリ使用量を最小限に抑えるために画像を正しくロードします(TBitmapSurfaceの1つ)」

      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