2016-07-27 269 views
1

我正在開發一個WPF應用程序來掃描不同的文檔。文件的大小不一樣,可以變化。WIA:設置動態頁面大小

我有我的代碼工作沒有掃描儀對話框,我希望用戶不必預覽圖像,然後掃描它得到真正的大小(導致兩個掃描)。

的問題是,我嘗試掃描

SetWIAProperty(item.Properties, "3097", 100); 

之前的頁面大小設置爲auto,但我得到HRESULT:0x80210067 System.Runtime.InteropServices.COMException。 我用google搜索了這個,發現我的掃描儀不支持這個屬性。

那麼,有什麼辦法可以達到這個目的嗎?我需要得到的掃描圖像只是文檔,而不是所有的掃描儀區域(我現在正在進行這項工作)。 如果我不能告訴掃描儀只掃描文檔,我也認爲在裁剪生成的圖像以獲取我所需要的文檔時,卻不知道如何執行此操作。

這裏是我的代碼:

   DeviceManager deviceManager = new DeviceManager(); 
       Device scanner = null; 
       foreach (DeviceInfo deviceInfo in deviceManager.DeviceInfos) 
       { 
        if (deviceInfo.DeviceID == scannerId) 
        { 
         scanner = deviceInfo.Connect(); 
         break; 
        } 
       } 

       if (scanner == null) 
       { 
        throw new Exception("Scanner not found"); 
       } 

       Item item = scanner.Items[1] as Item; 
       int dpi = 300; 
       SetWIAProperty(item.Properties, "6146", 1); // 1 Color 
       SetWIAProperty(item.Properties, "6147", dpi); // dpis 
       SetWIAProperty(item.Properties, "6148", dpi); // dpis 
       // This line throws the exception 
       //SetWIAProperty(item.Properties, "3097", 100); // page size 0=A4, 1=letter, 2=custom, 100=auto 

       try 
       { 
        ICommonDialog wiaCommonDialog = new CommonDialog(); 
        ImageFile scannedImage = (ImageFile)wiaCommonDialog.ShowTransfer(item, FormatID.wiaFormatPNG, false); 

        if (scannedImage != null) 
        { 
         ImageProcess imgProcess = new ImageProcess(); 
         object convertFilter = "Convert"; 
         string convertFilterID = imgProcess.FilterInfos.get_Item(ref convertFilter).FilterID; 
         imgProcess.Filters.Add(convertFilterID, 0); 
         SetWIAProperty(imgProcess.Filters[imgProcess.Filters.Count].Properties, "FormatID", FormatID.wiaFormatPNG); 
         scannedImage = imgProcess.Apply(scannedImage); 
         if (System.IO.File.Exists(@"D:\temp\scanwia3.png")) 
          System.IO.File.Delete(@"D:\temp\scanwia3.png"); 
         scannedImage.SaveFile(@"D:\temp\scanwia3.png"); 
        } 
        scannedImage = null; 
       } 
       finally 
       { 
        item = null; 
        scanner = null; 
       } 

而且SetWIAProperty功能:

private static void SetWIAProperty(IProperties properties, object propName, object propValue) 
    { 
     Property prop = properties.get_Item(ref propName); 
     prop.set_Value(ref propValue); 
    } 

任何幫助,將不勝感激。

親切的問候,

何塞。

回答

0

屬性Page Size屬於設備,而不是項目。

var WIA_IPS_PAGE_SIZE = "3097"; 
var WIA_PAGE_AUTO = 100; 

SetWIAProperty(scanner.Properties, WIA_IPS_PAGE_SIZE, WIA_PAGE_AUTO); 
+0

我試過這個,但我有同樣的例外。我終於放棄了這一點,最後的方法是顯示一個掃描預覽對話框:用戶首先預覽並裁剪圖像,然後掃描最終圖像。謝謝你的時間。 –

+0

我使用NTwain進行掃描,並且默認情況下啓用了自動調整大小。 – xiety

+0

也許NTwain提供了一些WIA無法直接實現的功能。但不幸的是,我現在不能改變爲NTwain。 –