2012-07-04 16 views
4

我有一臺HP Scanjet 7000(雙面打印& ADF掃描儀)和一臺HP Scanjet 5500c(僅限ADF)以及一臺正在開發的掃描儀程序, WIA 2.0在Windows 7帶有自動文檔進紙器(ADF)的C#WIA只能在特定掃描儀上回退一頁

的問題是,在代碼完美的作品上了年紀的掃描儀型號,但較新的一個代碼似乎通過第一頁就好運行,則無法在第二。如果我遍歷下面一行代碼,

image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatTIFF, false); 

另一個調用老的掃描儀停止,等待在相同的製造,但較新的一個剛剛經歷它的所有的網頁在一個連續的操作從給料機運行。

我發現,如果我使用Windows 7默認的掃描程序,較新的一個返回一個包含所有單獨的頁面一個.tif文件。較舊的返回單獨的.jpg文件(每頁一個)。

這表明,我認爲較新的掃描儀是通過其全送稿器掃描之前,它是準備回到那裏上了年紀一個掃描每個頁面之間返回一個圖像的圖像集合。

我如何支持代碼這種行爲?這上了年紀的掃描儀型號工程的相關代碼以下是部分:

public static List<Image> Scan(string scannerId) 
    { 
     List<Image> images = new List<Image>(); 
     List<String> tmp_imageList = new List<String>(); 

     bool hasMorePages = true; 
     bool useAdf = true; 
     bool duplex = false; 

     int pages = 0; 

     string fileName = null; 
     string fileName_duplex = null; 

     WIA.DeviceManager manager = null; 
     WIA.Device device = null; 
     WIA.DeviceInfo device_infoHolder = null; 
     WIA.Item item = null; 
     WIA.ICommonDialog wiaCommonDialog = null; 

     manager = new WIA.DeviceManager(); 

     // select the correct scanner using the provided scannerId parameter 
     foreach (WIA.DeviceInfo info in manager.DeviceInfos) 
     { 
      if (info.DeviceID == scannerId) 
      { 
       // Find scanner to connect to 
       device_infoHolder = info;   
       break; 
      } 
     } 

     while (hasMorePages) 
     { 
      wiaCommonDialog = new WIA.CommonDialog();    

      // Connect to scanner 
      device = device_infoHolder.Connect(); 

      if (device.Items[1] != null) 
      { 
       item = device.Items[1] as WIA.Item; 

       try 
       { 
        if ((useAdf) || (duplex)) 
         SetupADF(device, duplex); //Sets the right properties in WIA 

        WIA.ImageFile image = null; 
        WIA.ImageFile image_duplex = null; 

        // scan image     
        image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatTIFF, false); 

        if (duplex) 
        { 
         image_duplex = (ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatPNG, false); 
        } 

        // save (front) image to temp file 
        fileName = Path.GetTempFileName(); 
        tmp_imageList.Add(fileName); 
        File.Delete(fileName); 
        image.SaveFile(fileName); 
        image = null;    

        // add file to images list 
        images.Add(Image.FromFile(fileName)); 

        if (duplex) 
        { 
         fileName_duplex = Path.GetTempFileName(); 
         tmp_imageList.Add(fileName_duplex); 
         File.Delete(fileName_duplex); 
         image_duplex.SaveFile(fileName_duplex); 
         image_duplex = null; 

         // add file_duplex to images list 
         images.Add(Image.FromFile(fileName_duplex)); 
        } 

        if (useAdf || duplex) 
        { 
         hasMorePages = HasMorePages(device); //Returns true if the feeder has more pages 
         pages++;       
        } 
       } 
       catch (Exception exc) 
       { 
        throw exc; 
       } 
       finally 
       { 
        wiaCommonDialog = null; 
        manager = null; 
        item = null; 
        device = null; 
       } 
      } 
     } 
     device = null; 
     return images; 
    } 

在這個問題上的任何幫助將是非常非常感謝!我似乎無法在網上找到工作解決方案。只有沒有回答的論壇帖子來自同一問題的人。

+0

我真的希望我能看到你的「HasMorePages(設備)」方法。我正在爲這件事而掙扎。 – JDPeckham

回答

0

試驗和錯誤,我偶然發現這工作的原因,我不是很確定的解決方案的很多後。看起來像ShowTransfer()方法無法將頁面轉換爲.png或.tiff WHILE掃描。設置格式爲JPEG或BMP實際上解決這個問題對我來說:

image = (ImageFile)scanDialog.ShowTransfer(item, wiaFormatJPEG, false); 

我覺得我什麼地方看到過這種方法實際上返回BMP不管指定的格式在網絡上。可能是將圖像轉換爲png或tiff太重,而不是使用bmp或jpeg。

在一個旁註,我設置的屬性設置:3088至0x005(ADF和雙工模式)。

+0

這不是一個真正的解決方案,它會在不同的掃描儀中引發其他錯誤。 –

+0

當您設置3088時,您可以複製並粘貼代碼嗎? – s654m

0

我看到你調用一個名爲SetupADF方法,它沒有顯示,這可能是將設備對象的某些屬性。您是否嘗試過設置WIA_DPS_PAGES (property 3096)和/或WIA_DPS_SCAN_AHEAD_PAGES (property 3094)

我有一個blog post關於從Silverlight中的ADF掃描,我相信一個評論者提出了你遇到的同樣的問題。將WIA_DPS_PAGES設置爲1可以爲他解決這個問題。我結束了我的修改代碼的SetDeviceProperties方法設置WIA_DPS_PAGES爲1,WIA_DPS_SCAN_AHEAD_PAGES 0