概述
我正在填充一个 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
在这里没有提供有价值的解决方案。我不是在寻找任何奇迹,因为我知道大多数计算都需要很长的处理时间,我只需要在您可能需要提供的任何帮助和建议下尽可能减少这段时间。