Использование сканера без диалоговых окон в C#
Я создаю приложение .Net 4.0 для удаленного управления устройством сканера. Я пробовал библиотеки TWAIN и WIA, но у меня такая же проблема. Сканирование изображений без выбор сканера и диалоговые окна настроек сканирования.
Я нашел полезную статью о сценарии WIA в .Net, и модифицировал его так:
private Image Scan(string deviceName)
{
WiaClass wiaManager = null; // WIA manager COM object
CollectionClass wiaDevs = null; // WIA devices collection COM object
ItemClass wiaRoot = null; // WIA root device COM object
CollectionClass wiaPics = null; // WIA collection COM object
ItemClass wiaItem = null; // WIA image COM object
try
{
// create COM instance of WIA manager
wiaManager = new WiaClass();
// call Wia.Devices to get all devices
wiaDevs = wiaManager.Devices as CollectionClass;
if ((wiaDevs == null) || (wiaDevs.Count == 0))
{
throw new Exception("No WIA devices found!");
}
object device = null;
foreach (IWiaDeviceInfo currentDevice in wiaManager.Devices)
{
if (currentDevice.Name == deviceName)
{
device = currentDevice;
break;
}
}
if (device == null)
{
throw new Exception
(
"Device with name "" +
deviceName +
"" could not be found."
);
}
// select device
wiaRoot = (ItemClass)wiaManager.Create(ref device);
// something went wrong
if (wiaRoot == null)
{
throw new Exception
(
"Could not initialize device "" +
deviceName + ""."
);
}
wiaPics = wiaRoot.GetItemsFromUI
(
WiaFlag.SingleImage,
WiaIntent.ImageTypeColor
) as CollectionClass;
if (wiaPics == null || wiaPics.Count == 0)
{
throw new Exception("Could not scan image.");
}
Image image = null;
// enumerate all the pictures the user selected
foreach (object wiaObj in wiaPics)
{
if (image == null)
{
wiaItem = (ItemClass)Marshal.CreateWrapperOfType
(
wiaObj, typeof(ItemClass)
);
// create temporary file for image
string tempFile = Path.GetTempFileName();
// transfer picture to our temporary file
wiaItem.Transfer(tempFile, false);
// create Image instance from file
image = Image.FromFile(tempFile);
}
// release enumerated COM object
Marshal.ReleaseComObject(wiaObj);
}
if (image == null)
{
throw new Exception("Error reading scanned image.");
}
return image;
}
finally
{
// release WIA image COM object
if (wiaItem != null)
Marshal.ReleaseComObject(wiaItem);
// release WIA collection COM object
if (wiaPics != null)
Marshal.ReleaseComObject(wiaPics);
// release WIA root device COM object
if (wiaRoot != null)
Marshal.ReleaseComObject(wiaRoot);
// release WIA devices collection COM object
if (wiaDevs != null)
Marshal.ReleaseComObject(wiaDevs);
// release WIA manager COM object
if (wiaManager != null)
Marshal.ReleaseComObject(wiaManager);
}
}
С этим мне действительно удалось выбрать устройство из конфигурации (вход параметр метода сканирования) и получить полученное изображение после сканирования.
но проблема с диалогом параметров сканирования (сканирование с использованием DEVICENAME). Поскольку это приложение удаленного управления, диалог не будет виден пользователю, поэтому мне нужно либо пропустить его, используя настройки по умолчанию, либо использовать настройки из конфигурации, если это необходимо.
диалоговое окно параметры сканирования :
3 ответов
в конце концов я не использовал код, написанный в вопросе для сканирования диалогов. Я нашел полезный пример сканирование с помощью Windows Image Acquisition 2.0 библиотека и изменил его в соответствии с моими потребностями. Сканирование без каких-либо диалогов.
Я написал статью о использование сканера без диалоговых окон в .Net с примером приложения, написанного на C#.
во-первых, большое спасибо Миленко Барбир за его решение выше, он отлично работает.
Я хотел бы добавить, что если вы хотите нулевые диалоги, вы можете использовать (из демо-кода Милиенко)
WIA.ImageFile image = item.Transfer(wiaFormatBMP);
вместо
WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);
это в основном удаляет индикатор выполнения, так что вы получаете сканирование без каких-либо диалогов.
// show scanner view
guif.ShowUI = 0;
guif.ModalUI = 0;
вы можете видеть в этом коде, который я реализовал.