7

尝试创建一个针对快速扫描仪优化的图像采集应用程序(它可以为每张纸以 150 ppm 的速度提供多达 6 个压缩图像 [彩色+灰色+二进制][正面+背面])我遇到了一些速度问题。使用 TWAIN 技术和内存缓冲区传输模式 (TWSX_MEMORY) 我从扫描仪接收图像缓冲区(作为内存中加载的 JPEG 或 TIFF 文件)并将其保存到我的应用程序目标路径。如果我不想创建缩略图,我的应用程序不会导致扫描仪的速度损失,但如果我愿意,由于我这样做的方式(将缓冲区保存到我的 C++ TWAIN 处理 dll 中的文件中,通知我的 .NET 主机应用程序使用函数指针的目标文件路径,在 C# 中打开图像文件并创建缩略图),我的应用程序会导致扫描速度的极端速度损失。我尝试了一些优化,例如在单独的线程中执行加载阶段并将非托管图像文件缓冲区发送到 .NET 主机并尝试在不安全的上下文 (UnmanagedMemoryStream) 中加载它并创建缩略图。但它并没有显着提高速度。所以我的问题是:

在内存中有一个图像文件缓冲区(例如,没有嵌入缩略图的 24 位 JPEG 压缩),是否有一种快速直接的方法可以从中创建缩略图图像?在这种情况下,您建议使用什么作为创建缩略图的最快方法?

4

2 回答 2

7

如果是 JPEG 图像,您可以简单地丢弃大部分 DCT 数据,并仅使用 DCT 系数创建两倍大小的缩略图。

如果您能找到它的来源,请查看Enlightenment 项目中的EPEG 。它完全符合您对 JPEG 文件的要求,完全无需解码或解压缩图像。源代码将非常有启发性。

对于其他图像格式,它并不是那么简单 - 您需要将图像解码并渲染到内存缓冲区,然后执行您自己的缩放。CImg 和 boost::GIL 库可以提供帮助。

于 2009-08-22T18:21:17.307 回答
3

我认为问题在于将图像转换为缩略图比首先获取图像需要更长的时间,对吗?

尽管更快的缩略图转换程序可能会为您解决问题,但对于计算机速度较慢的人来说可能还不够。相反,我建议创建一个要转换为缩略图的图像队列——即,您有一个线程(或进程)将扫描的图像添加到队列中,另一个线程/进程从该队列中删除图像并从中创建缩略图。这样,两个操作的相对速度就无关紧要了。

于 2009-08-22T16:04:56.567 回答