0

我需要根据短时间计时器事件(500ms 给或采取)。

从本质上讲,它应该像一个缓慢的动画一样工作,但显示每个图像至关重要。

我已经在 C# 中粗略地编写了一个简单的应用程序来执行此操作,但是似乎图像加载和显示花费的时间超过了 500 毫秒,因此某些图像永远不会显示。

有什么办法可以避免这种情况吗?预加载或创建 101 个图片框并显示和隐藏?

有人有什么建议吗?

4

5 回答 5

2

什么时间最长?图片加载还是显示?您是否在需要显示时加载每个图像?查看您的代码将非常有价值。

如果您确定它始终是 101 个图像,请将它们全部加载到System.Drawing.Bitmap first的数组中,然后有一个迭代器变量,该变量在每次调用Ticka 事件时递增Timer。使用此 Tick 事件将数组中的图像加载到 PictureBox 中。PictureBox.Image = myBitmapArray[iterator]如果使用递增迭代器++i%=101;,则不会出现 OutOfBounds 错误,并且动画将循环。

于 2010-10-19T13:28:04.090 回答
1

Bitmap在开始动画之前填充对象数组。

于 2010-10-19T13:20:07.590 回答
1

几个选项...选择一个或组合它们:

(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,
詹姆斯

于 2010-10-19T17:17:50.933 回答
0

我没有具体的答案给你,但我会通过首先确定它是图像加载、图像显示还是这两个动作都花费太多时间来解决这个问题。

我想图像加载会相对较快,即使图像尺寸非常大,只要图像是本地的并且您拥有相对不错的硬件。我的第一次尝试将涉及从一个线程按顺序加载所有图像,这样您的应用程序就不必在下一个图像加载之前等待图像显示完成。

如果图像显示需要很长时间(即使在我非常强大的工作站上,对于大图像也不是那么快),那么您是否可以在应用程序显示所有内容之前缩放图像?您的应用程序是否需要处理全分辨率图像?如今,使用百万像素相机,我无法想象您希望图像文件中的所有数据都存在,因为尺寸很容易超过显示器分辨率的 6 倍。

于 2010-10-19T13:22:37.650 回答
0

可能需要关注的另一件事是图像的大小。如果都是 18 兆像素图像,我可以看到它需要很多时间或很多空间。

当您最初加载它们时,您可能希望将它们调整为显示区域的大小,这样您就不会使用 2 gigs 的内存或等待读取磁盘,具体取决于您的实现方式。

于 2010-10-19T13:34:40.643 回答