如何使用 WIA 2.0 以编程方式检测指定扫描仪的所有可用分辨率(以 dpi 为单位)?支持的页面大小如何?有任何想法吗?
3 回答
伪代码:假设您有设备信息,连接到它:
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 可能都设置为相同的值 .. 这可能并非所有扫描仪的情况!
您可以使用 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;
}
水平和垂直分辨率属性有一个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;
}