2009-08-22 60 views
7

試圖創建一個圖像採集應用程序,爲快速掃描儀進行了優化(可以爲每張紙以150 ppm的速度提供多達6個壓縮圖像[顏色+灰度+二進制] [前置+後置])我有一些速度的問題。 使用TWAIN技術和內存緩衝區傳輸模式(TWSX_MEMORY)我從掃描儀接收圖像緩衝區(如加載到內存中的JPEG或TIFF文件)並將其保存到我的應用程序目標路徑。 如果我不想創建縮略圖,我的應用程序不會造成掃描儀速度的損失,但是如果我想這樣做,我會這樣做(將緩衝區保存到處理dll的C++ TWAIN文件中,通知我的.NET主機使用函數指針的目標文件路徑的應用程序,使用C#打開圖像文件並創建縮略圖圖像),我的應用程序會導致掃描速度極快的速度損失。 我嘗試了一些優化,例如在一個單獨的線程中執行加載階段並向.NET主機發送非託管圖像文件緩衝區,並嘗試將其加載到不安全的上下文(UnmanagedMemoryStream)中並創建縮略圖。但它並沒有顯着提高速度。所以我的問題是:在內存中有一個圖像文件緩衝區,創建其縮略圖的最快方法是什麼?

在內存中有一個圖像文件緩衝區(例如24位JPEG壓縮沒有嵌入的縮略圖),有沒有一個快速直接的方式來創建從它的縮略圖圖像?你認爲在這種情況下創建縮略圖的最快方法是什麼?

回答

7

如果是JPEG圖像,可以簡單地丟棄大部分DCT數據,然後僅使用DCT係數以兩種尺寸的冪創建縮略圖。

如果您可以找到它的來源,請參閱啓蒙項目中的EPEG。它完全符合您使用JPEG文件查找的內容,完全不需要對圖像進行解碼或解壓縮。源代碼將非常有益。

對於其他圖像格式,並不那麼簡單 - 您需要將圖像解碼並渲染到內存緩衝區,然後執行自己的縮放。 CImg和boost :: GIL庫可以提供幫助。

+0

謝謝,這似乎是我想要的。 – 2009-08-23 10:03:46

+1

我已經設法測試了EPEG,對於有興趣做同樣事情的人,我應該提一下,EPEG庫現在已經從啓示源代碼中刪除了,因此您應該在其舊源代碼中搜索它,例如: http://download.enlightenment.org/snapshots/2008-01-25/。 – 2009-08-23 12:43:42

+0

對於TIFF圖像,我使用以下代碼:http://www.koders.com/c/fidFAE1882A0596B9D224D831B852AE9891D0154D6D.aspx。 它不如EPEG快,但完成了工作。 – 2009-08-24 08:59:22

3

我認爲問題在於,將圖像轉換爲縮略圖所花費的時間比首先獲取圖像花費的時間更長,對嗎?

儘管更快的縮略圖轉換程序可能會爲您解決問題,但對於使用較慢計算機的人來說,這可能還不夠。相反,我建議創建一個要轉換爲縮略圖的圖像隊列 - 即,您有一個將掃描圖像添加到隊列的線程(或進程),另一個線程/進程從該隊列中刪除圖像並從中創建縮略圖。這樣兩種操作的相對速度並不重要。

+0

感謝您的回答, 我已經試過這種方法,它顯着提高了性能,但它還不夠快。 我不確定我是否正確地做了它,但我應該添加一個Application.DoEvents()調用到我的C#代碼,使我的縮略圖查看器控件(填充在其他線程中創建的縮略圖)無效,整個過程仍然導致掃描儀在掃描5份以上文件後等待片刻(少於1秒)。與設備附帶的商業應用程序(我試圖克隆它的速度並添加我需要的功能)相比,它速度不夠快。 – 2009-08-22 16:15:47

+0

不幸的是,我不熟悉C#(或TWAIN),但我無法理解排隊結果如何降低掃描器速度。我假設你已經將縮略圖轉換線程/進程的優先級設置爲低於獲取線程/進程的優先級?這是可以考慮的一個可能原因。 – 2009-08-22 16:29:21

+0

再次感謝, 我不確定,在我看來,主線程以外的c#線程總是比主線程具有更低的優先級。但是,下一個答案(greyfade)似乎是我需要的更多功能解決方案。 – 2009-08-23 10:02:41

相關問題