我需要从文件系统加载101个位图(它们不能作为资源构建到应用程序中,因为它们将针对程序的每次运行进行更改)依次基于短持续时间计时器事件加载到Windows窗体应用程序图片框中(500ms给予或采取)。
基本上它应该像慢动画一样工作,但每个图像都必须显示出来。
我在C#中粗略地使用了一个简单的应用程序来执行此操作,但是图像加载和显示的时间似乎超过了500毫秒,因此一些图像永远不会显示。
有什么方法可以避免这种情况吗?预加载或创建101个图片框并显示和隐藏?
有人有什么建议吗?
答案 0 :(得分:1)
在开始动画之前填充Bitmap
个对象的数组。
答案 1 :(得分:1)
花费的时间最长?图像加载还是显示?您是否在需要显示时加载每个图像?看看你的代码真的很有价值。
如果您确定它将始终是101个图像,请将它们全部加载到System.Drawing.Bitmap
第一个的数组中,然后使用一个迭代器变量,该变量在每次调用时都会递增{ {1}}事件为Tick
。让这个Tick事件使用Timer
将数组中的图像加载到PictureBox中如果使用PictureBox.Image = myBitmapArray[iterator]
递增迭代器,则不会出现OutOfBounds错误,动画将循环播放。
答案 2 :(得分:1)
有两个选项......选择一个或组合它们:
(1)使用锁和计数器来保证当事件触发时它正在加载下一个图像。
(2)在Tick
事件中禁用计时器,然后在加载图像后重新启用它。结果是图像在最后一个图像被绘制后500ms到达,因此如果图像需要一秒钟加载,则图像在t = 1000ms,t = 1500ms,t = 3000ms等处绘制。所有图像都被绘制,保证在图片之间传递500毫秒,但动画可能显得很慢。
(3)执行上述操作,但跟踪事件开始的时间,并在绘制图像后,将下一个计时器刻度设置为500 - (现在 - 事件启动)...如果图像需要250毫秒到平局,下一个计时器刻度将在250ms内触发。如果现在 - eventStart< 0,下一个计时器刻度应立即触发。动画将花费尽可能少的时间,但图像可能会闪烁,只出现几毫秒。
(4)使用PictureBox.LoadAsync()
为您提供多线程...下一个事件可以在上一个事件绘制时加载图像。但是,如果您需要保证图像全部被绘制,则需要在调用LoadAsync()之前等待的Mutex
事件中释放LoadCompleted
。
(5)我不确定图片的图纸是否属于版面类别,但您可以在加载图片之前/之后尝试拨打SuspendLayout()
和ResumeLayout()
(6)使用图像数组,锁定计数器,并使用.Image
的{{1}}属性让您预先加载图像。我相信这是在另一个答案中提出的,也是
HTH,
詹姆斯
答案 3 :(得分:0)
我没有给你一个具体的答案,但我会首先确定它是图像加载,图像显示还是两个花费太多时间的动作。
我认为图像加载会相对较快,即使图像尺寸非常大,只要图像是本地的,并且你有相对不错的硬件。我的第一次尝试将涉及从顺序加载线程中的所有图像,以便您的应用程序不必等待图像显示在下一个图像加载之前完成。
如果图像显示需要很长时间(甚至在我真正强大的工作站上,对于大图像而言并不是那么快),那么您是否可以在应用程序显示所有内容之前缩放图像?您的应用程序是否需要处理全分辨率图像?如今,凭借百万像素摄像头,无论如何,我无法想象您想要将所有数据都存储在图像文件中,因为尺寸很容易超过显示器分辨率6倍。
答案 4 :(得分:0)
可能需要考虑的另一件事是图像的大小。如果这些都是18百万像素图像,我可以看到它需要花费大量时间或大量空间。
当您最初加载它们时,您可能希望将它们调整为显示区域的大小,这样您就不会使用2演出的ram或等待读取磁盘,具体取决于您的实现方式。