使用WIA检测所有可用的扫描仪分辨率

时间:2011-06-02 13:51:42

标签: resolution wia

如何使用WIA 2.0以编程方式检测指定扫描仪的所有可用分辨率(以dpi为单位)?支持的页面大小怎么样?有什么想法吗?

3 个答案:

答案 0 :(得分:5)

伪代码: 假设您有设备信息,请连接到它:

var device = deviceInfo.Connect(); 如果device不为null ......那么你可以得到Item 请注意,项目从设备项目的索引1开始

Item item = device.Items[1]; Item具有您可以枚举的各种属性 例如

foreach (Property prop in item.Properties) { var temp = prop.Name + " " + prop.PropertyID + " " + prop.get_Value(); }

在这种情况下,您可以使用扫描仪支持的最大DPI。 “水平光学分辨率”(属性编号:3090) “垂直光学分辨率”属性id:3091

..但是,如果您检查属性枚举,您将看到没有任何内容可以告诉您所有可用DPI设置的最小值或列表。 ..现在我找不到任何东西....... 但是我确实找到了发现最小DPI的方法...... 您可能知道WIA意图,枚举允许您设置扫描类型,例如颜色,灰度等(属性ID:6146)

var currentIntent = item.Properties.get_Item("6146"); // set to colour currentIntent.set_Value(WiaImageIntent.ColorIntent);

..但是你也可以用这种方式设置WIA图像偏差(最大质量或最小尺寸) 这不是通过图像意图枚举,而是通过对适当的值进行OR运算

// set minimum size as WIA bias var intent = (int)item.Properties.get_Item("6146").get_Value(); item.Properties.get_Item("6146").set_Value(intent | 0x00010000);

http://msdn.microsoft.com/en-us/library/ms630190%28v=vs.85%29.aspx

如果你现在看一下DPI(假设之前的DOI实际上并不是最小的)

var dpiHorizontal = item.Properties.get_Item("6147").get_Value(); var dpiVertical = item.Properties.get_Item("6148").get_Value(); ..你应该看到DPI现在设置为最低(给出最小尺寸扫描)

一个很大的警告。

只要您设置偏差(无论是最小尺寸还是最高质量),您设置的任何先前DPI值都会发生变化(图像尺寸等各种其他属性也会发生变化 - 它会进行大范围的更改)。

..所以,如果你想保持控制,我建议只找到一次最小dpi并将其存储在配置中 - 或者如果你每次都这样做,丢弃该项目(在获得最小DPI后)并使用新项目没有偏见。

..所以你现在有最大和最小DPI值 - 如何获得列表?

..我再也不知道......但是 你可以有一个“合理的DPI值”列表 例如75,100,150,200,300,600,1200,2400 作为(取决于扫描仪分辨率),这些是支持的“流行”值 ..根据您的最大/最小DPI值,您知道哪些“流行”值可能值得尝试。

..当设置DPI时,通过try / catch

进行

e.g。

try { item.Properties.get_Item("6147").set_Value(myDPI); // horizontal DPI item.Properties.get_Item("6148").set_Value(myDPI); // vertical DPI } catch { // not supported so have some logic where try a different “popular” value }

我在使用的一台扫描仪上看到了这种类型的问题 - 仅仅因为DPI在最大/最小限制范围内并不意味着它受支持。 虽然许多扫描仪WIA驱动程序支持100,100 DPI,但这个不提供75,75 DPI或150,150 DPI 这种方法很讨厌而且很有效但是很有效(再次你可以这样做一次,运行你的流行“DPI”值列表,尝试设置它们,并留下扫描仪支持的DPI设置列表。

为了简单起见,这些伪代码示例假定为垂直&水平DPI都可以设置为相同的值。所有扫描仪可能不是这种情况!

答案 1 :(得分:0)

您可以使用WIA_IPS_XRES和WIA_IPS_YRES的SubTypeMin和SubTypeMax属性来获取允许的分辨率范围。您可以使用类似的东西来确定支持哪些页面大小。

WIA.Property horizontalResolutionProperty = FindProperty(_scannerDevice.Items[1].Properties, HORIZONTAL_RESOLUTION);
if (horizontalResolutionProperty != null)
{
    // SubTypeMin and SubTypeMax are subproperties that tell what the min and max values are for the given property
    if (horizontalResolutionProperty.SubTypeMin > minResolution) minResolution = horizontalResolutionProperty.SubTypeMin;
    if (horizontalResolutionProperty.SubTypeMax < maxResolution) maxResolution = horizontalResolutionProperty.SubTypeMax;
}
WIA.Property verticalResolutionProperty = FindProperty(_scannerDevice.Items[1].Properties, VERTICAL_RESOLUTION);
if (verticalResolutionProperty != null)
{
    // SubTypeMin and SubTypeMax are subproperties that tell what the min and max values are for the given property
    if (verticalResolutionProperty.SubTypeMin > minResolution) minResolution = verticalResolutionProperty.SubTypeMin;
    if (verticalResolutionProperty.SubTypeMax < maxResolution) maxResolution = verticalResolutionProperty.SubTypeMax;
}

答案 2 :(得分:0)

水平和垂直分辨率属性具有Subtype属性,根据其值,您可以访问分辨率的允许值或多个值:    

var xResolutionProperty = item.Properties["Horizontal Resolution"];

switch (xResolutionProperty.SubType)
{
    case WIASubType.ListSubType:
        // Here you can access property SubTypeValues, which contains a list of allowed values for the resolution.
        break;
    case WIASubType.RangeSubTypes:
        // Here you can access SubTypeMin and SubTypeMax properties, with the minimum and maximum allowed values.
        break;
    case WIASubType.UnspecifiedSubType:
        // Here you can access SubTypeDefault property, which contains the default resolution value.
        break;
}