5

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

4

3 回答 3

6

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

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

Item item = device.Items[1]; 一个项目有各种你可以枚举的属性,例如

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

在这种情况下,您可以使用扫描仪支持的最大 DPI。“水平光学分辨率”(属性 ID: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 ing 适当的值来完成

// 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 进行

例如

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 可能都设置为相同的值 .. 这可能并非所有扫描仪的情况!

于 2011-06-27T12:50:25.457 回答
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;
}
于 2014-04-03T23:06:05.290 回答
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;
}
于 2018-08-22T18:29:16.503 回答