gpt4 book ai didi

c# - 在 Windows 窗体 (c#.net) 应用程序中加速从磁盘加载图像

转载 作者:太空狗 更新时间:2023-10-29 18:24:12 24 4
gpt4 key购买 nike

我目前正在开发一款允许用户播放(自动滚动)一系列本地镜像的应用程序。通常屏幕上会同时出现五六个。

目前的主要瓶颈似乎是从磁盘实际加载图像数据。计时器线程要求图像每 1/6 秒更新一次,应用程序正在努力跟上该速度。每张图片大约 25Kb。

我尝试创建一个滚动缓存来尝试预加载图像,但这也被自己 catch 了,所以最终速度变慢了。

计时器的每一次节拍,我都会循环使用六个图像占位符,使用标准加载下一张图像

Image img = Image.FromFile("filename");

方法,但认为有人可能知道从磁盘上获取图像的更快方法。

六个集合中的每一个都有 500 到 20,000 张图像,因此它太大而无法在开始时将整个图像加载到内存中。

如果有人建议以更快的方式提取这些图像,我们将不胜感激。


编辑以添加应用程序流程的更多细节。

好的,这是正在发生的事情:

用户点击“播放”按钮。计时器线程以 1/6 秒超时开始。

定时器回调:

Update image index (_index++)
for each viewer in list of visible viewers (the forms to display images)
{
get the filename from the id stored in the viewer
check to see if the file exists
if it does exist,
create new bitmap from image
and return that image
otherwise return null

if returned image isn't null, display it on screen
}

这显然跨越了几个层 - 图像加载在服务层进行,然后将其传递到表示,然后传递到 UI,但这就是发生的事情的要点。

最佳答案

我遇到了 this page其中描述了如何直接使用 GDI+ API 加载图像。使用非常简单:

ImageFast.FromFile(@"C:\MyPhoto.JPG");

已添加以显示 ImageFast 相对于 Image From File 方法的速度

这使用找到的源代码 here .代码已复制粘贴,无需更改。

Stopwatch watch = Stopwatch.StartNew();

string filePath = @"C:\TestImage25k.png";

Image fromFile = Image.FromFile(filePath);

watch.Stop();

Console.WriteLine("Image.FromFile Ticks = {0:n}", watch.ElapsedTicks);

long fromFileTicks = watch.ElapsedTicks;

watch.Reset();
watch.Start();

Image fastImage = ImageFast.FromFile(filePath);

watch.Stop();

long fastFileTicks = watch.ElapsedTicks;

Console.WriteLine("ImageFast.FromFile Ticks = {0:n}", watch.ElapsedTicks);

Console.WriteLine("fromFileTicks - fastFileTicks = {0:n}", fromFileTicks - fastFileTicks);

控制台输出是

Image.FromFile     Ticks = 19,281,605.00ImageFast.FromFile Ticks = 7,557,403.00fromFileTicks - fastFileTicks = 11,724,202.00

您可以看到 ImageFast 的影响。随着时间的推移,这 1100 万个保存的滴答声会加起来。

关于c# - 在 Windows 窗体 (c#.net) 应用程序中加速从磁盘加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com