2016-07-27 16 views
1

Я разрабатываю приложение WPF для сканирования различных документов со сканера. Размер документов не будет одинаковым, может быть переменным.WIA: настройка динамического размера страницы

У меня есть мой код, работающий без диалогов сканера, и я бы хотел, чтобы пользователь не должен был просматривать изображение, а затем сканировать его, чтобы получить реальный размер (в результате получилось два сканирования).

Проблема заключается в том, что я пытаюсь установить страницу размера на авто перед сканированием

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

, но я получаю HRESULT: 0x80210067 System.Runtime.InteropServices.COMException. Я придумал это и увидел, что мой сканер не поддерживает это свойство.

Итак, есть ли способ достичь этого? Мне нужно, чтобы получившееся отсканированное изображение было только документом, а не всей областью сканера (которую я сейчас обрезаю). В случае, если сканер сканирует только документ, я не мог сканировать только документ, я подумал также обрезать полученное изображение, чтобы получить только тот документ, который мне нужен, но не знаю, как это сделать прямо сейчас.

Вот мой код:

   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); 
    } 

Любая помощь будет оценена.

С уважением,

Jose.

ответ

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. –

Смежные вопросы