获取WIA扫描仪功能

问题描述

| 如何获得扫描仪的可用分辨率和/或dpi。另外,如何获取具有自动文档进纸器等的信息?     

解决方法

        您可以通过浏览属性对象(如Matthias所建议的内容)来检索扫描仪可用的功能。 这是我使用的所有属性及其ID的枚举:
public enum WiaProperty
{
    DeviceId = 2,Manufacturer = 3,Description = 4,Type = 5,Port = 6,Name = 7,Server = 8,RemoteDevId = 9,UIClassId = 10,FirmwareVersion = 1026,ConnectStatus = 1027,DeviceTime = 1028,PicturesTaken = 2050,PicturesRemaining = 2051,ExposureMode = 2052,ExposureCompensation = 2053,ExposureTime = 2054,FNumber = 2055,FlashMode = 2056,FocusMode = 2057,FocusManualDist = 2058,ZoomPosition = 2059,PanPosition = 2060,TiltPostion = 2061,TimerMode = 2062,TimerValue = 2063,PowerMode = 2064,BatteryStatus = 2065,Dimension = 2070,HorizontalBedSize = 3074,VerticalBedSize = 3075,HorizontalSheetFeedSize = 3076,VerticalSheetFeedSize = 3077,SheetFeederRegistration = 3078,// 0 = LEFT_JUSTIFIED,1 = CENTERED,2 = RIGHT_JUSTIFIED
    HorizontalBedRegistration = 3079,2 = RIGHT_JUSTIFIED
    VerticalBedRegistraion = 3080,// 0 = TOP_JUSTIFIED,2 = BOTTOM_JUSTIFIED
    PlatenColor = 3081,PadColor = 3082,FilterSelect = 3083,DitherSelect = 3084,DitherPatternData = 3085,DocumentHandlingCapabilities = 3086,// FEED = 0x01,FLAT = 0x02,DUP = 0x04,DETECT_FLAT = 0x08,// DETECT_SCAN = 0x10,DETECT_FEED = 0x20,DETECT_DUP = 0x40,// DETECT_FEED_AVAIL = 0x80,DETECT_DUP_AVAIL = 0x100
    DocumentHandlingStatus = 3087,// FEED_READY = 0x01,FLAT_READY = 0x02,DUP_READY = 0x04,// FLAT_COVER_UP = 0x08,PATH_COVER_UP = 0x10,PAPER_JAM = 0x20
    DocumentHandlingSelect = 3088,// FEEDER = 0x001,FLATBED = 0x002,DUPLEX = 0x004,FRONT_FIRST = 0x008
                                            // BACK_FIRST = 0x010,FRONT_ONLY = 0x020,BACK_ONLY = 0x040
                                            // NEXT_PAGE = 0x080,PREFEED = 0x100,AUTO_ADVANCE = 0x200
    DocumentHandlingCapacity = 3089,HorizontalOpticalResolution = 3090,VerticalOpticalResolution = 3091,EndorserCharacters = 3092,EndorserString = 3093,ScanAheadPages = 3094,// ALL_PAGES = 0
    MaxScanTime = 3095,Pages = 3096,// ALL_PAGES = 0
    PageSize = 3097,// A4 = 0,LETTER = 1,CUSTOM = 2
    PageWidth = 3098,PageHeight = 3099,Preview = 3100,// FINAL_SCAN = 0,PREVIEW = 1
    TransparencyAdapter = 3101,TransparecnyAdapterSelect = 3102,ItemName = 4098,FullItemName = 4099,ItemTimeStamp = 4100,ItemFlags = 4101,AccessRights = 4102,DataType = 4103,BitsPerPixel = 4104,PreferredFormat = 4105,Format = 4106,Compression = 4107,// 0 = NONE,JPG = 5,PNG = 8
    MediaType = 4108,ChannelsPerPixel = 4109,BitsPerChannel = 4110,Planar = 4111,PixelsPerLine = 4112,BytesPerLine = 4113,NumberOfLines = 4114,GammaCurves = 4115,ItemSize = 4116,ColorProfiles = 4117,BufferSize = 4118,RegionType = 4119,ColorProfileName = 4120,ApplicationAppliesColorMapping = 4121,StreamCompatibilityId = 4122,ThumbData = 5122,ThumbWidth = 5123,ThumbHeight = 5124,AudioAvailable = 5125,AudioFormat = 5126,AudioData = 5127,PicturesPerRow = 5128,SequenceNumber = 5129,TimeDelay = 5130,CurrentIntent = 6146,HorizontalResolution = 6147,VerticalResolution = 6148,HorizontalStartPosition = 6149,VerticalStartPosition = 6150,HorizontalExtent = 6151,VerticalExtent = 6152,PhotometricInterpretation = 6153,Brightness = 6154,Contrast = 6155,Orientation = 6156,// 0 = PORTRAIT,1 = LANDSCAPE,2 = 180°,3 = 270°
    Rotation = 6157,3 = 270°
    Mirror = 6158,Threshold = 6159,Invert = 6160,LampWarmUpTime = 6161,}
有关每个属性的可能值,您可以阅读MSDN文档: MSDN WIA文档 或者,如果您想更深入一点,可以分析原始SDK的头文件。     ,        您可以使用包含属性列表的Properties对象。使用“设备”对象的“属性”对象访问扫描仪属性(文档进纸器),使用“项目”对象的“属性”对象访问页面属性(分辨率)。 这是一些代码:
        DeviceManager manager = new DeviceManagerClass();
        DeviceInfo scannerInfo = WiaHelper.FindFirstScanner(manager);
        Device device = scannerInfo.Connect();
        Item item = device.Items[1];

    public static DeviceInfo FindFirstScanner(DeviceManager manager)
    {
        DeviceInfos infos = manager.DeviceInfos;
        foreach (DeviceInfo info in infos)
            if (info.Type == WiaDeviceType.ScannerDeviceType)
                return info;
        return null;
    }

    public static Property FindProperty(WIA.Properties properties,int propertyId)
    {
        foreach (Property property in properties)
            if (property.PropertyID == propertyId)
                return property;
        return null;
    }

    public static void SetDeviceProperty(Device device,int propertyId,object value)
    {
        Property property = FindProperty(device.Properties,propertyId);
        if (property != null)
            property.set_Value(value);
    }

    public static object GetDeviceProperty(Device device,int propertyId)
    {
        Property property = FindProperty(device.Properties,propertyId);
        return property != null ? property.get_Value() : null;
    }

    public static object GetItemProperty(Item item,int propertyId)
    {
        Property property = FindProperty(item.Properties,propertyId);
        return property != null ? property.get_Value() : null;
    }

    public static void SetItemProperty(Item item,object value)
    {
        Property property = FindProperty(item.Properties,propertyId);
        if (property != null)
            property.set_Value(value);
    }