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

标签 c++ image-processing jpeg thumbnails tiff

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

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

最佳答案

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

如果您能找到它的来源,请查看 Enlightenment 项目中的 EPEG。它完全可以满足您对 JPEG 文件的需求,完全无需对图像进行解码或解压缩。源代码将非常有指导意义。

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

关于c++ - 在内存中有一个图像文件缓冲区,创建其缩略图的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316170/

相关文章:

java - 静态类变量存储在内存中的什么位置?

c# - 不安全边缘检测仍然很慢

android - glsl编程架构哪一部分是 "really"并行执行?

python - 如何使用opencv对齐多个相机图像

jpeg - MJPG 图像格式的网络摄像头

php - 在 Linux 中将 .PPT (2007-x) 转换为 JPEG/GIF

c++ - 为什么 memcpy() 是一种向 `std::map` 添加元素的方法?

c++ - 为什么保留额外内存时 vector 中的对象没有 move ?

image - 错误图像::比较(jpg 文件)

c++ - OpenCL clEnqueueTasks 并行性