【问题标题】:Having an image file buffer in memory, what is the fastest way to create its thumbnail?在内存中有一个图像文件缓冲区,创建其缩略图的最快方法是什么?
【发布时间】:2010-11-21 22:01:15
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答,我已经尝试过这种方法,它可以显着提高性能,但速度还不够快。我不确定我做的是否正确,但我应该在我的 C# 代码中添加一个 Application.DoEvents() 调用,以使我的缩略图查看器控件(填充在其他线程中创建的缩略图)无效,并且整个过程仍然会导致扫描仪在扫描 5 张以上的纸张后等待片刻(不到一秒)。与设备附带的商业应用程序(我试图克隆它的速度并添加我需要的功能)相比,它还不够快。
    • 不幸的是,我不熟悉 C#(或 TWAIN),但我不明白排队结果如何减慢扫描仪的速度。我假设您已将缩略图转换线程/进程的优先级设置为低于获取线程/进程的优先级?这是一个需要考虑的可能原因。
    • 再次感谢,我不确定,在我看来,主线程以外的 c# 线程的优先级总是低于主线程。但是,下一个答案(灰色渐变)似乎是我需要的更实用的解决方案。
    • 没问题。在这种情况下,我建议您 +1 和/或将 grayfade 的答案标记为正确。
    猜你喜欢
    • 2019-11-17
    • 2015-06-15
    • 2014-07-08
    • 2015-03-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多