在内存中有一个图像文件缓冲区,创建缩略图的最快方法是什么?

时间:2009-08-22 15:16:57

标签: c++ image-processing jpeg thumbnails tiff

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

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

2 个答案:

答案 0 :(得分:7)

如果是JPEG图像,您只需丢弃大部分DCT数据,并仅使用DCT系数创建功率为2的缩略图。

如果您可以找到它的来源,请查看Enlightenment项目中的 EPEG 。它完全符合您正在寻找的JPEG文件,完全不需要解码或解压缩图像。源代码非常有用。

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

答案 1 :(得分:3)

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

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