- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在开发一款允许用户播放(自动滚动)一系列本地镜像的应用程序。通常屏幕上会同时出现五六个。
目前的主要瓶颈似乎是从磁盘实际加载图像数据。计时器线程要求图像每 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/
程序集,masm 嘿,我写了宏来打印存储在 dane1 段中的 1 字节值。 我将值除以 16,然后将提醒推送到堆栈,直到值==0。然后我弹出提醒将它们转换为 ASCII 码,并打印它们。 有人可以看
我在 Apache Geronimo 2.1.3 上有一个 Web 服务应用程序。 我正在使用 JAX-WS,使用 SOAP 1.1 注释 POJOS。 (使用 Sun JDK 1.5) 各种客户端都
我有一个数据变量,monthArray,它被多个消费者读取,并由单个定期更新程序线程定期更新数据。全部异步。 我已经考虑了这两个选项来安全地执行更新。 ArrayList tempArray
我有一组 3D 体。每个 Body 由 8 个点定义,每个点具有三个坐标。所有的物体都是立方体的或近似立方体的。我想用系统的点栅格“填充”立方体。坐标存储在简单的 data.frames 中。 我开发
我正在处理遗留代码,需要打补丁。 问题:一个古老的应用程序发送错误的 HTTP POST 请求。其中一个参数未经过 URL 编码。我知道这个参数总是排在最后而且我知道它的名字。我现在正尝试在运行在 t
我想在触摸屏幕时移动 sprite body ,但它不能发生...... -(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
这个问题在这里已经有了答案: Can a union be initialized in the declaration? (3 个答案) 关闭 7 年前。 如果它是一个struct那么它就可以完成
我正在尝试获取生成 sigsys 信号的系统调用的地址!但我从 gcc 收到以下错误: gcc emulator.c -fms-extensions error: ‘siginfo_t’ has no
当我使用 Postman 进行 API 调用时,我收到一个 JSON 对象..这是我所期望的。 但是,当我像这样与 Guzzle 进行相同的调用时: $client = new \GuzzleHttp
在编码时,出现了差异。通常在编写简单的方法或构造函数时,我经常使用表达式体技术。但是,当我产生以下内容时: public class Sample : ISample { private r
我正在使用 LibGDX 创建一个新项目。 我想做的是,我将 tmx 文件中的主体加载到工作正常的关卡中。尸体也有一个 Sprite 。 问题是,我想让用户触摸场景中的某些 body 。当他们触摸 b
我的意图:在不使用 union 的情况下循环遍历一个结构的 30 个成员,所有成员都是字符数组类型,每个成员都存储对 itoa 的调用结果。在下面的代码中,我将结构体成员命名为a-z、A-D。在调用函
我必须将我的代码段之一从 C 转换为 java。代码如下。 union commandString{ char commndStr[20]; struct{ char
#include union NumericType { float value; int intvalue; }Values; int main() { Values.va
我在此代码中收到错误: fun num(num:Int):Int { if (num > 0){ print(num % 10) return num / 10
我是一名优秀的程序员,十分优秀!