概要
ViewStyle を vsIcon に設定して TListView を設定しています。Listview は TImageList に接続されており、Listview に追加された各項目には、対応するインデックスで指定された独自の画像があります。
アイデアは、一連のビットマップを一度に操作するプロセスを自動化できるようにすることです。サイズは常に同じですが、各ビットマップは異なります。
この仕組みの性質上、ImageList に追加されるビットマップの数に固定サイズや制限はありません。唯一の制限は、使用可能なシステム メモリです。
問題
私が抱えている問題は、これらのビットマップでの操作のパフォーマンスに関連しています。操作とは、グレースケール、色の交換、明るさの調整など、ビットマップでさまざまな画像処理技術を実行することを意味します。
ここで、サイズが 1Mb のビットマップの明るさを調整するのに 3 秒かかるとします。ImageList に合計 10 個のビットマップがある場合、このプロセスには約 30 秒かかります。
(注:GetTickCountなどで速度をテストしていません。これらは単なる例です)。
ただし、前に述べたように、この ImageList のサイズは任意である可能性があり、潜在的に処理時間が永遠に続く可能性があるという事実を考慮してください。
これらのビットマップで操作を実行するときは、ループ内で GetBitmap を使用して、各ビットマップをオフスクリーン バッファーのビットマップに送信し、次のように操作を実行します。
var
Bmp: TBitmap;
i: Integer;
begin
Bmp := TBitmap.Create;
try
ImageList1.BeginUpdate;
try
for i := 0 to ImageList1.Count - 1 do
begin
ImageList1.GetBitmap(i, Bmp);
Bmp.PixelFormat := pf24Bit;
// perform manipulation to Bmp here
ImageList1.Replace(i, Bmp, nil);
end;
finally
ImageList1.EndUpdate;
end;
finally
Bmp.Free;
end;
end;
任意のサイズまたは量の画像を含む可能性のある ImageList に対してそれを実行すると、これがどのように遅くなるかを理解できるかもしれません。
これを行う方法を最適化および改善する方法を探しています。現時点では、パフォーマンスに関して許容できるほどではありません。BeginUpdate
ここでは価値のある解決策を提供しEndUpdate
ません。ほとんどの計算には長い処理時間が必要であることを理解しているので、奇跡を探しているわけではありません。あなたが提供しなければならない助けやアドバイスがあれば、この時間をできるだけ短縮する必要があります.