【问题标题】:Detect all available scanner resolutions using WIA使用 WIA 检测所有可用的扫描仪分辨率
【发布时间】:2011-06-02 13:51:42
【问题描述】:

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

【问题讨论】:

    标签: resolution wia


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,“水平光学分辨率”(属性 ID:3090)“垂直光学分辨率”属性 ID:3091 不是很有用。正如您在my post 中看到的那样,我的扫描仪支持高达 2400dpi。但这仅适用于 TWAIN-Driver。 WIA 2.0 驱动程序(我在几小时前更新)仅支持高达 600dpi。
    • @0xBADF00D 你有没有找到解决方案?我看到了 3090/3091 属性,但是当我尝试编辑它们时被拒绝访问。您的帖子链接现在已失效,因此我无法查看。
    • @DanielDees 不幸的是,它似乎是驱动程序问题。但是 Andrew 在我关于迭代到最高允许值的问题下方发表了评论。也许这有帮助
    【解决方案2】:

    您可以使用 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;
    }
    

    【讨论】:

      【解决方案3】:

      水平和垂直分辨率属性有一个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;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-12
        • 2012-03-05
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 2011-01-15
        相关资源
        最近更新 更多