Windows 图像获取 - 在 C# 中设置设备属性

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/912303/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 02:39:21  来源:igfitidea点击:

Windows image acquisition - setting device properties in C#

c#wia

提问by codelove

I have a C# (WinForm) program that supports scanning using WIA. I am trying to set device properties before scanning one or more documents. Primarily I want to set the paper size for the scanner. Following is a snippet of the code:

我有一个支持使用 WIA 扫描的 C# (WinForm) 程序。我试图在扫描一个或多个文档之前设置设备属性。主要是我想设置扫描仪的纸张尺寸。以下是代码片段:

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

I am finding the Horizontal Bed Size property, but the question is how do I set it to a value? There is a set_Value property off of property but that seems to take a ref to a result object. So I am at a loss as to how can I set properties on a device?

我正在查找 Horizo​​ntal Bed Size 属性,但问题是如何将其设置为值?属性外有一个 set_Value 属性,但它似乎需要对结果对象的引用。所以我不知道如何在设备上设置属性?

采纳答案by codelove

I am working on a scanning project as well, and there are very few WIA examples. This code is what you are looking for to set the bed size, DPI, etc. Check out the SetProperty method with an example on how to deal with set_Value.

我也在做一个扫描项目,WIA 的例子很少。这段代码是您要设置床尺寸、DPI 等的代码。请查看 SetProperty 方法以及如何处理 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();
    }
}