Почему WIA не видит мой сканер?
Я пытаюсь использовать WIA (Microsoft Windows Image Acquisition Library v2.0) для создания приложения WinForms С# 3.5 в VS2008, работающего на Vista для размещения изображений со сканера.
Я знаю, что есть много SDK, которые делают это (Accusoft, ByteScout, Knowledge Lake и т.д.), но нам нужен некоторый контроль над пользовательским интерфейсом (или отсутствием) и возможность настраивать обработку и обработку изображений, поэтому мы пытаемся использовать угол WIA.
Однако мне не удалось заставить WIA "видеть" мой сканер.
В проекте VS ссылается dll DLL-библиотеки Microsoft Windows Image Acquisition Library v2.0, и я включил 'using WIA;' в верхней части страницы.
Вот раздел кода:
//Choose Scanner
CommonDialogClass class1 = new CommonDialogClass();
Device d = class1.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);
if (d != null)
{
this.DeviceID = d.DeviceID;
}
else
{
//no scanner chosen
return;
}
Соответствует штрафу, но строка 2 (Устройство d =...) запускает следующую ошибку при запуске:
Исключение из HRESULT: 0x80210015
Из того, что я могу сказать, обычно это означает, что ваше устройство отключено или не включено или устройство не совместимо с WIA.
Но сканер, о котором идет речь, отображается в панели управления/сканерах и камерах (означает совместимость с WIA) и работает при доступе через Photoshop (означает, что он включен).
Я подключил другие устройства (Digital SLR), и приведенный выше код может "видеть" их, поэтому код работает.
Есть ли у кого-нибудь какие-либо предложения относительно того, что происходит не так и как его исправить?
Обновление 1:
Я попробовал несколько разных сканеров (Canon 5000F, Benq 5250C), но та же проблема.
Обновление 2:
Я не смог найти окончательного доказательства этого, но я думаю, что сканеры, которые я тестировал, или, возможно, большинство сканеров:(, не поддерживаются WIA/поддерживаются. Я теперь изучаю TWAIN, но все равно хотел бы услышать о тех, кто имел успех с WIA.
Обновление 3:
Закончилось переключение WIA и использование .NET Twain SDK (EZTwain). Все отсортировано сейчас. Спасибо всем за вклад.
Ответы
Ответ 1
Я думаю, что ваш сканер не поддерживает WIA
. Я рекомендую использовать TWAIN, который поддерживается большинством вендоров.
Я рекомендую использовать библиотеку NTWAIN:
Nuget Pakcage:
https://www.nuget.org/packages/NTwain/
Исходный код:
https://bitbucket.org/soukoku/ntwain
Ответ 2
Взгляните на эту статью на CodeProject, которая описывает TWAIN. Это может помочь вам в этом направлении, вот еще одна статья о WIA, несмотря на то, что она немного устарела, но стоит взглянуть, тем не менее,.
Ответ 3
Я бы попробовал следующий код при подключении только вашего сканера
IDeviceManager dm = ClassFactory.createDeviceManager();
System.out.println(dm.deviceInfos().count());
если диспетчер устройств может видеть ваш сканер вообще
Ответ 4
wiaImage = wiaDiag.ShowAcquireImage(WiaDeviceType.ScannerDeviceType, WiaImageIntent.GrayscaleIntent, WiaImageBias.MaximizeQuality, wiaFormatJPEG, true, true, false);
WIA.Vector vector = wiaImage.FileData;
FileExtention = wiaImage.FileExtension;
Image i = Image.FromStream(new MemoryStream((byte[])vector.get_BinaryData()));
pbPreview1.Image = i;//to show preview of scanned image in picturebox
Ответ 5
Это мой способ протестировать сканер WIA:
private bool WIAScannerTest()
{
try
{
WIA.CommonDialog wiaObj = New WIA.CommonDialog();
WIA.Device wiaDev =
wiaObj.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, false, false);
return true;
}
catch (Exception ex)
{}
finally
{
if(wiaDev != null)
{
Marshal.ReleaseComObject(wiaDev)
wiaDev = null;
}
if(wiaObj != null)
{
Marshal.ReleaseComObject(wiaObj)
wiaObj = null;
}
}
return false;
}
Ответ 6
ICommonDialog dialog = new CommonDialog();
Device device = dialog.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);
В качестве альтернативы.
Ответ 7
Скорее всего, для устройств не установлены драйверы WIA. Я бы предложил вам использовать TWAIN вместо этого, который поддерживается почти всеми поставщиками.
Существует довольно много открытых источников, а также коммерчески обертки TWAIN. Большинство из них работают для 32-битных приложений, а 64-битные приложения не имеют доступа к 32-битным TWAIN-драйверам. Если вам необходимо поддерживать как 64-битное, так и 32-битное WinForms WPF-приложение, вы можете использовать Asprise С# VB.NET-сканирование для twain wia-сканера.