[英]Why can't WIA see my scanner?
我正在嘗試使用WIA(Microsoft Windows Image Acquisition Library v2.0)在Vista平台上運行的VS2008中構建一個C#3.5 WinForms應用程序,以從掃描儀中獲取圖像。
我知道有很多SDK可以做到這一點(Accusoft,ByteScout,Knowledge Lake等),但我們想要對UI(或缺乏)進行一些控制,並且能夠自定義圖像的處理和處理,這是為什么我們嘗試WIA角度。
但是,我無法讓WIA“看到”我的掃描儀。
VS項目中引用了“Microsoft Windows Image Acquisition Library v2.0”dll,我已經包含了“使用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訪問時工作(意味着它已打開)。
我已插入其他設備(數碼單反相機),上面的代碼可以“看到”它們,因此代碼正常工作。
有沒有人對什么是錯誤以及如何解決它有任何建議?
更新1 :
我嘗試了幾種不同的掃描儀(Canon 5000F,Benq 5250C),但同樣的問題。
更新2 :
我一直無法找到這方面的確切證據,但我認為我一直在測試的掃描儀,或者大多數掃描儀:(,不兼容/支持WIA。我現在正在考慮使用TWAIN,但是我仍然希望聽到任何與WIA取得成功的人。
更新3 :結束了放棄WIA並使用.NET Twain SDK(EZTwain)。 現在全部排序。 感謝大家的投入。
我認為您的掃描儀不支持WIA
。 我建議使用大多數供應商支持的TWAIN。
我建議使用NTWAIN庫:
Nuget Pakcage: https ://www.nuget.org/packages/NTwain/
ICommonDialog dialog = new CommonDialog();
Device device = dialog.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);
作為備選。
當僅連接掃描儀時,我會嘗試以下代碼
IDeviceManager dm = ClassFactory.createDeviceManager();
System.out.println(dm.deviceInfos().count());
如果設備管理員可以完全看到您的掃描儀
最有可能的是,沒有為設備安裝WIA驅動程序。 我建議您應該使用TWAIN,幾乎所有供應商都支持。
有很多開源以及商業TWAIN包裝。 其中大多數適用於32位應用程序,64位應用程序無法訪問32位TWAIN驅動程序 。 如果您需要同時支持64位和32位 WinForms WPF應用程序,您可以考慮使用Asprise C#VB.NET掃描twain wia掃描程序 。
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
這是我測試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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.