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
気に入った場合は、下の[いいね]と[お気に入り]をクリックするだけで、次の共有を見ることができます。