如何使用 WIA C# 创建快速双面扫描?
How to create fast duplex scanning with WIA C#?
我是WIA新手。我被要求使扫描服务扫描速度更快和双面扫描。我目前的服务扫描一页,然后将其放入 pdf 等,直到少于 20 页(这个数字只是我之前使用的拐杖,如果有人解释如何获得 "if there is any paper in there" 变量,我会很高兴)。我开始挖掘并在 MSDN 上找到描述属性的文档,然后找到 this post describing duplex sanning, but with mysterious 5 in set. After I found this 并弄清楚我需要 WIA_DPS_DOCUMENT_HANDLING_SELECT 设置为 0x205(FEEDER + DUPLEX + AUTO_ADVANCE)。所以我试着像这样设置它们:
private static void SetProperty(Property property, int value)
{
IProperty x = (IProperty)property;
Object val = value;
x.set_Value(ref val);
}
...一些代码...
foreach (Property prop in device.Properties)
{
//LOGGER.Warn(prop.Name);
//LOGGER.Warn(prop.PropertyID);
switch ((Int32)prop.PropertyID)
{
// Document Handling Select
case 3088:
SetProperty(prop, 517);
break;
// Pages
case 3096:
SetProperty(prop, 1);
break;
}
}
它对我不起作用...它只是停留在设置...有人可以解释如何设置 AUTO_ADVANCE 和 DUPLEX 道具吗?或者 "make scanning faster and duplex" 需要的不仅仅是 AUTO_ADVANCE 和 DUPLEX,而我对它们的看法是错误的?或者我应该在我的扫描描述中考虑 "ISIS / TWAIN (Windows XP / Vista / 7 / 8 / 8.1 / 10)" 字符串并使用其他库?
(Window 10,佳能 DR-M160||、DR-M160 和 DR-M160II Windows 的驱动程序)
这里还有当前的获取函数:
public List<ImageFile> FetchImageList()
{
List<ImageFile> imageList = new List<ImageFile>();
//bool hasMorePages = true;
int testcount = 0;
while (testcount >= 0)
{
testcount--;
WIA.Device device = FindDevice(_deviceId);
if (device == null)
{
LOGGER.Warn("Scanner device not found");
return null;
}
// get item
WIA.Item scanItem = device.Items[1] as WIA.Item;
LOGGER.Debug($"ScanItem: {scanItem.ItemID}");
try
{
foreach (Property prop in device.Properties)
{
//LOGGER.Warn(prop.Name);
//LOGGER.Warn(prop.PropertyID);
switch ((Int32)prop.PropertyID)
{
// Document Handling Select
case 3088:
LOGGER.Warn("here");
SetProperty(prop, 517);
LOGGER.Warn("here");
break;
// Pages
case 3096:
SetProperty(prop, 1);
break;
}
}
// scan image
WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
WIA.ImageFile image = (WIA.ImageFile)scanItem.Transfer(WIA.FormatID.wiaFormatPNG);
imageList.Add(image);
LOGGER.Warn("Front");
//get back side
image = (WIA.ImageFile)scanItem.Transfer(WIA.FormatID.wiaFormatPNG);
imageList.Add(image);
LOGGER.Warn("Back");
}
catch (Exception e)
{
throw (e);
}
}
return imageList;
}
好吧...我尝试在没有 AUTO_ADVANCE 的情况下进行双面扫描,并在 Transfer 调用时得到 HRESULT: 0x8000FFFF (E_UNEXPECTED)。根据this post(尽管那是在Windows 7上)我想我无法通过使用WIA为我解决这个问题,仍然希望有其他建议...
已解决问题
我使用 saraff.twain 并且它对我有用:
- git 页:https://github.com/saraff-9EB1047A4BEB4cef8506B29BA325BD5A/Saraff.Twain.NET
带有 grate wiki 页面的好库。(也有类似的 .net 4.6.1 库)
我是WIA新手。我被要求使扫描服务扫描速度更快和双面扫描。我目前的服务扫描一页,然后将其放入 pdf 等,直到少于 20 页(这个数字只是我之前使用的拐杖,如果有人解释如何获得 "if there is any paper in there" 变量,我会很高兴)。我开始挖掘并在 MSDN 上找到描述属性的文档,然后找到 this post describing duplex sanning, but with mysterious 5 in set. After I found this 并弄清楚我需要 WIA_DPS_DOCUMENT_HANDLING_SELECT 设置为 0x205(FEEDER + DUPLEX + AUTO_ADVANCE)。所以我试着像这样设置它们:
private static void SetProperty(Property property, int value)
{
IProperty x = (IProperty)property;
Object val = value;
x.set_Value(ref val);
}
...一些代码...
foreach (Property prop in device.Properties)
{
//LOGGER.Warn(prop.Name);
//LOGGER.Warn(prop.PropertyID);
switch ((Int32)prop.PropertyID)
{
// Document Handling Select
case 3088:
SetProperty(prop, 517);
break;
// Pages
case 3096:
SetProperty(prop, 1);
break;
}
}
它对我不起作用...它只是停留在设置...有人可以解释如何设置 AUTO_ADVANCE 和 DUPLEX 道具吗?或者 "make scanning faster and duplex" 需要的不仅仅是 AUTO_ADVANCE 和 DUPLEX,而我对它们的看法是错误的?或者我应该在我的扫描描述中考虑 "ISIS / TWAIN (Windows XP / Vista / 7 / 8 / 8.1 / 10)" 字符串并使用其他库?
(Window 10,佳能 DR-M160||、DR-M160 和 DR-M160II Windows 的驱动程序)
这里还有当前的获取函数:
public List<ImageFile> FetchImageList()
{
List<ImageFile> imageList = new List<ImageFile>();
//bool hasMorePages = true;
int testcount = 0;
while (testcount >= 0)
{
testcount--;
WIA.Device device = FindDevice(_deviceId);
if (device == null)
{
LOGGER.Warn("Scanner device not found");
return null;
}
// get item
WIA.Item scanItem = device.Items[1] as WIA.Item;
LOGGER.Debug($"ScanItem: {scanItem.ItemID}");
try
{
foreach (Property prop in device.Properties)
{
//LOGGER.Warn(prop.Name);
//LOGGER.Warn(prop.PropertyID);
switch ((Int32)prop.PropertyID)
{
// Document Handling Select
case 3088:
LOGGER.Warn("here");
SetProperty(prop, 517);
LOGGER.Warn("here");
break;
// Pages
case 3096:
SetProperty(prop, 1);
break;
}
}
// scan image
WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
WIA.ImageFile image = (WIA.ImageFile)scanItem.Transfer(WIA.FormatID.wiaFormatPNG);
imageList.Add(image);
LOGGER.Warn("Front");
//get back side
image = (WIA.ImageFile)scanItem.Transfer(WIA.FormatID.wiaFormatPNG);
imageList.Add(image);
LOGGER.Warn("Back");
}
catch (Exception e)
{
throw (e);
}
}
return imageList;
}
好吧...我尝试在没有 AUTO_ADVANCE 的情况下进行双面扫描,并在 Transfer 调用时得到 HRESULT: 0x8000FFFF (E_UNEXPECTED)。根据this post(尽管那是在Windows 7上)我想我无法通过使用WIA为我解决这个问题,仍然希望有其他建议...
已解决问题 我使用 saraff.twain 并且它对我有用: - git 页:https://github.com/saraff-9EB1047A4BEB4cef8506B29BA325BD5A/Saraff.Twain.NET 带有 grate wiki 页面的好库。(也有类似的 .net 4.6.1 库)