我需要根据短时间计时器事件(500ms 给或采取)。
从本质上讲,它应该像一个缓慢的动画一样工作,但显示每个图像至关重要。
我已经在 C# 中粗略地编写了一个简单的应用程序来执行此操作,但是似乎图像加载和显示花费的时间超过了 500 毫秒,因此某些图像永远不会显示。
有什么办法可以避免这种情况吗?预加载或创建 101 个图片框并显示和隐藏?
有人有什么建议吗?
我需要根据短时间计时器事件(500ms 给或采取)。
从本质上讲,它应该像一个缓慢的动画一样工作,但显示每个图像至关重要。
我已经在 C# 中粗略地编写了一个简单的应用程序来执行此操作,但是似乎图像加载和显示花费的时间超过了 500 毫秒,因此某些图像永远不会显示。
有什么办法可以避免这种情况吗?预加载或创建 101 个图片框并显示和隐藏?
有人有什么建议吗?
什么时间最长?图片加载还是显示?您是否在需要显示时加载每个图像?查看您的代码将非常有价值。
如果您确定它始终是 101 个图像,请将它们全部加载到System.Drawing.Bitmap
first的数组中,然后有一个迭代器变量,该变量在每次调用Tick
a 事件时递增Timer
。使用此 Tick 事件将数组中的图像加载到 PictureBox 中。PictureBox.Image = myBitmapArray[iterator]
如果使用递增迭代器++i%=101;
,则不会出现 OutOfBounds 错误,并且动画将循环。
Bitmap
在开始动画之前填充对象数组。
几个选项...选择一个或组合它们:
(1) 使用锁和计数器来保证当事件触发时它会加载下一个图像。
(2) 在事件中禁用计时器Tick
,然后在加载图像后重新启用它。结果是图像在最后一张绘制后500ms到达,所以如果一张图片加载需要一秒钟,则图像在t=1000ms、t=1500ms、t=3000ms等时间绘制。所有图像都绘制完毕,并且图片之间保证通过500ms,但动画可能会显得很慢。
(3) 做上面的,但是跟踪事件开始的时间,并且在图像绘制之后,设置下一个计时器滴答为 500 - (Now - eventStart)... 这样如果图像需要 250ms 来绘制,下一个计时器滴答将在 250 毫秒内触发。如果 Now - eventStart < 0,则下一个计时器滴答应立即触发。动画将花费尽可能少的时间,但图像可能会闪过,仅出现几毫秒。
(4)PictureBox.LoadAsync()
用来给你一些多线程……下一个事件可以在上一个事件绘制的同时加载图像。但是,如果您需要保证所有图像都被绘制,您需要在调用 LoadAsync() 之前等待Mutex
的情况下释放它。LoadCompleted
(5)我不确定图片的绘制是否属于Layout类别,但是您可以尝试在加载图像之前/之后调用SuspendLayout()
和ResumeLayout()
(6) 使用图像数组,锁定一个计数器,并使用 的.Image
属性PictureBox
让您预加载图像。我相信这是在另一个答案中提出的,也
HTH,
詹姆斯
我没有具体的答案给你,但我会通过首先确定它是图像加载、图像显示还是这两个动作都花费太多时间来解决这个问题。
我想图像加载会相对较快,即使图像尺寸非常大,只要图像是本地的并且您拥有相对不错的硬件。我的第一次尝试将涉及从一个线程按顺序加载所有图像,这样您的应用程序就不必在下一个图像加载之前等待图像显示完成。
如果图像显示需要很长时间(即使在我非常强大的工作站上,对于大图像也不是那么快),那么您是否可以在应用程序显示所有内容之前缩放图像?您的应用程序是否需要处理全分辨率图像?如今,使用百万像素相机,我无法想象您希望图像文件中的所有数据都存在,因为尺寸很容易超过显示器分辨率的 6 倍。
可能需要关注的另一件事是图像的大小。如果都是 18 兆像素图像,我可以看到它需要很多时间或很多空间。
当您最初加载它们时,您可能希望将它们调整为显示区域的大小,这样您就不会使用 2 gigs 的内存或等待读取磁盘,具体取决于您的实现方式。