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

ham*_*eza 7 c++ jpeg tiff image-processing thumbnails

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

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

gre*_*ade 7

如果它是JPEG图像,您可以简单地丢弃大部分DCT数据,并仅使用DCT系数创建功率为2的缩略图.

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

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