2009-05-26 16 views
5

Tengo un programa C# (WinForm) que admite el escaneo utilizando WIA. Estoy tratando de establecer las propiedades del dispositivo antes de escanear uno o más documentos. Principalmente quiero establecer el tamaño del papel para el escáner. Lo que sigue es un fragmento de código:Adquisición de imágenes de Windows: configuración de las propiedades del dispositivo en C#

foreach (Property property in selectedDevice.Properties) 
{ 
    //WiaProperties.WiaDpsHorizontalBedSize is my constant 
    if (property.PropertyID == WiaProperties.WiaDpsHorizontalBedSize) 
    { 
     //Set property value here...    
    } 
} 

estoy encontrando la cama propiedad Tamaño horizontal, pero la pregunta es ¿cómo se ajusta a un valor? Hay una propiedad set_Value fuera de la propiedad, pero parece tomar una referencia a un objeto resultante. Por lo tanto, no sé cómo puedo configurar propiedades en un dispositivo.

Respuesta

10

Estoy trabajando en un proyecto de escaneo también, y hay muy pocos ejemplos de WIA. Este código es lo que está buscando para establecer el tamaño de la cama, DPI, etc. Consulte el método SetProperty con un ejemplo sobre cómo lidiar con set_Value.

class Scan 
{ 
    // Scanner only device properties (DPS) 
    public const int WIA_RESERVED_FOR_NEW_PROPS = 1024; 
    public const int WIA_DIP_FIRST = 2; 
    public const int WIA_DPA_FIRST = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS; 
    public const int WIA_DPC_FIRST = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS; 
    public const int WIA_DPS_FIRST = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS; 
    public const int WIA_DPS_DOCUMENT_HANDLING_STATUS = WIA_DPS_FIRST + 13; 
    public const int WIA_DPS_DOCUMENT_HANDLING_SELECT = WIA_DPS_FIRST + 14; 
    public const int FEEDER = 1; 
    public const int FLATBED = 2; 
    public const int DUPLEX = 4; 
    public const int FEED_READY = 1; 

    WIA.CommonDialog _dialog = new WIA.CommonDialog(); 
    WIA.Device _scanner; 

    public void ADFScan() 
    { 

     _dialog = new CommonDialogClass(); 
     _scanner = _dialog.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, false, false); 


     foreach (Property item in _scanner.Items[1].Properties) 
     { 
      switch (item.PropertyID) 
      { 
       case 6146: //4 is Black-white,gray is 2, color 1 
        SetProperty(item, 2); 
        break; 
       case 6147: //dots per inch/horizontal 
        SetProperty(item, 100); 
        break; 
       case 6148: //dots per inch/vertical 
        SetProperty(item, 100); 
        break; 
       case 6149: //x point where to start scan 
        SetProperty(item, 0); 
        break; 
       case 6150: //y-point where to start scan 
        SetProperty(item, 0); 
        break; 
       case 6151: //horizontal exent 
        SetProperty(item, (int)(8.5 * 100)); 
        break; 
       case 6152: //vertical extent 
        SetProperty(item, 11 * 100); 
        break; 
      } 
     } 
     ImageFile image = (ImageFile)_scanner.Items[1].Transfer(FormatID.wiaFormatPNG); 
     System.IO.File.Delete("tmp.png"); 
     image.SaveFile("tmp.png"); 
    } 

    private void SetProperty(Property property, int value) 
    { 
     IProperty x = (IProperty)property; 
     Object val = value; 
     x.set_Value(ref val); 
    } 


    public void test() 
    { 
     bool WantsToScan = true; 
     while (WantsToScan) ScanAndSaveOnePage(); 

    } 


    static void Main(string[] args) 
    { 
     new Scan().test(); 
    } 
} 
+0

Nice. ¿Podrías explicarme por qué es necesario este elenco? Propiedad IProperty x = (IProperty); – driAn

Cuestiones relacionadas