Why can't WIA see my scanner?
Asked Answered
B

7

25

I'm trying to use WIA (Microsoft Windows Image Acquisition Library v2.0) to build a C# 3.5 WinForms app in VS2008 running on a Vista rig to aquire images from a scanner.

I know there are plenty of SDKs out there that do this (Accusoft, ByteScout, Knowledge Lake, etc) but we wanted some control over the UI (or lack of) and the ability to customize the processing and handling of the images, which is why we're trying the WIA angle.

However, I have been unable to get WIA to 'see' my scanner.

The 'Microsoft Windows Image Acquisition Library v2.0' dll has been referenced in the VS project and I have included 'using WIA;' at the top of the page.

Here is the section of code:

//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;
}

Complies fine but line 2 (Device d = ...) kicks the following error when run:
Exception from HRESULT: 0x80210015

From what I can tell, this usually means your device is unplugged/not turned on or the device is not WIA compatible.
But the scanner in question shows up in Control Panel/Scanners and Cameras (means it's WIA compatible) and works when accessed via Photoshop (means it's turned on).

I have plugged in other devices (Digital SLR) and the above code can 'see' them, so the code is working.

Does anyone have any suggestions as to what is going wrong and how to fix it?

Update 1:
I have tried a couple of different scanners (Canon 5000F, Benq 5250C), but same problem.

Update 2:
I have been unable to find definitive proof of this, but I'm thinking that the scanners I have been testing with, or maybe most scanners :( , are not WIA compatible/supported. I'm am now looking into using TWAIN, but would still love to hear of anyone who has had some success with WIA.

Update 3: Ended up ditching WIA and using a .NET Twain SDK (EZTwain). All sorted now. Thanks to everyone for thier input.

Bounder answered 10/3, 2010 at 1:29 Comment(2)
@Mitch. Yeah, checked that. I had made sure it's got the current version of the driver. And it works no problem in photoshop.Bounder
possible duplicate of Camera Capture with WIA, C# and Win 7Upsweep
I
2

I think your scanner doesn't support WIA. I recommend to use TWAIN which is supported by most vendors.

I recommend to use NTWAIN library:

Nuget Pakcage: https://www.nuget.org/packages/NTwain/

Source Code: https://bitbucket.org/soukoku/ntwain

Invalidity answered 24/11, 2016 at 15:16 Comment(0)
O
0

Have a look at this article on CodeProject that covers TWAIN. This might help you in that direction, also, here is another article about WIA, despite it is a bit old but worth a look nonetheless.

Operatic answered 10/3, 2010 at 1:50 Comment(1)
Hi Tommie, I had seen both of those pages during my research on this (and played with the code from them). However, the Twain article is from 2001 and even mentions WIA as a more modern approach. And the WIA article is for WIA 1.0 which is for XP only, I'm using the WIA 2.0 which is for Vista/Win7. But thanks anyway.Bounder
S
0

I would try the following code when connected only your scanner

IDeviceManager dm = ClassFactory.createDeviceManager();
System.out.println(dm.deviceInfos().count());

if the device manager can see your scanner at all

Silvereye answered 9/9, 2010 at 13:6 Comment(0)
P
0
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
Pokpoke answered 2/4, 2011 at 6:21 Comment(0)
H
0

This is my way to test WIA scanner:

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;
}
Haymow answered 14/1, 2012 at 10:45 Comment(0)
F
0
ICommonDialog dialog = new CommonDialog();
Device device = dialog.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);

As an alternative.

Fantom answered 14/3, 2015 at 14:26 Comment(0)
A
0

Most likely, no WIA drivers are installed for the devices. I would suggest you should use TWAIN instead, which is supported by almost all vendors.

There are quite a number of open source as well as commercially TWAIN wrappers. Most of them work for 32bit applications and 64bit applications fail to access 32bit TWAIN drivers. If you need to support both 64bit and 32bit WinForms WPF application, you may consider to use Asprise C# VB.NET scanning for twain wia scanner.

Argos answered 25/8, 2016 at 4:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.