Click here to Skip to main content
12,885,784 members (42,731 online)
Click here to Skip to main content
Add your own
alternative version


330 bookmarked
Posted 18 May 2002

WIA Scripting and .NET

, 19 May 2002 Public Domain
Rate this:
Please Sign up or sign in to vote.
How to use Windows Image Acquisition on Windows XP. Useful for integrating scanners, digital cameras, webcams and still-video.

Sample Image - wiascriptingdotnet.jpg

Disclaimer: The information in this article & source code are published in accordance with the final [V1] bits of the .NET Framework


This sample shows how to use Windows XP Windows Image Acquisition (WIA) Scripting with .NET and C#. It is useful for integrating with scanners, digital cameras, webcams and still-video.

Note, this article doesn't save you from reading the detailed WIA documentation!


WIA is a standardized Win32 API for acquiring digital images from devices that are primarily used to capture still images, and for managing these devices. WIA was introduced with Windows Millennium and updated for Windows XP. Today, most digital imaging devices are supported on XP by built-in or manufacturer provided WIA drivers.

The API is exposed as COM interfaces, in two flavors:

  • WIA custom interfaces - mainly for C++ programmers.
  • WIA Scripting Model - designed for scripting languagues and it provides a type library.

A seamless and low-effort integration with .NET is (currently) only possible with WIA Scripting.

WIA Scripting

The WIA Scripting Model is described in the WIA Scripting reference on MSDN Platform SDK. The typical steps needed to acquire an image are as follows:

  • Create the WIA Manager COM object.
  • With the help of the WIA manager, let the user select an imaging device (scanner/camera/...).
  • The selected device gets accessible as a new WIA root device item (another COM object).
  • With this device item, we present a GUI dialog to the user for picking up pictures.
  • These pictures get accessible as a collection of WIA image items.
  • Finally, we can transfer each of these image items e.g. to disk files!

With pseudo code this looks as simple as:

manager = new Wia
root = manager.Create
collection = root.GetItemsFromUI

WIA provides its own common dialogs to select a device:

WIA device selection dialog box

and e.g. dialogs specific to a scanner device, ... or specific to a photo camera device:

WIA common dialogs to define images

Note, some tasks are also possible without user (GUI) interaction. One such method is Item.TakePicture but you should check the documentation for a complete list.

The WIA Scripting Model organizes all known items (devices, folders, pictures,...) in a hierarchical structure, e.g.: WIA Camera Tree. An advanced application can recursively enumerate this tree using the Item.Children property:

root                             e.g. Camera Device
     item2                       e.g. Folder
           item21                e.g. Picture1
           item22                e.g. Picture2


To use WIA Scripting in your Visual Studio .NET project, add a reference to the component "Microsoft Windows Image Acquisition 1.01 Type Library" (wiascr.dll)

WIA Scripting COM component reference with VS.NET

Without VS.NET, you will have to use the TLBIMP tool.

Now you can add the WIA Scripting namespace at the top of your C# code file:

using System.IO;
using System.Runtime.InteropServices;

// namespace of imported WIA Scripting COM component
using WIALib;

This imported library namespace provides mapping of the WIA Scripting types to .NET wrapper classes:

  • Wia => WiaClass
  • DeviceInfo => DeviceInfoClass
  • Item => ItemClass
  • Item.Children => CollectionClass

and now you can write code like this simplified sample to acquire pictures:

// create COM instance of WIA manager
wiaManager = new WiaClass();		
object selectUsingUI = System.Reflection.Missing.Value;

// let user select device
wiaRoot = (ItemClass) wiaManager.Create( 
    ref selectUsingUI );  

// this call shows the common WIA dialog to let 
// the user select a picture:
wiaPics = wiaRoot.GetItemsFromUI( WiaFlag.SingleImage,
    WiaIntent.ImageTypeColor ) as CollectionClass;

// enumerate all the pictures the user selected
foreach( object wiaObj in wiaPics )      
    wiaItem = (ItemClass) Marshal.CreateWrapperOfType( 
        wiaObj, typeof(ItemClass) );

    // create temporary file for image
    imageFileName = Path.GetTempFileName();      
    // transfer picture to our temporary file
    wiaItem.Transfer( imageFileName, false );             

For more information on COM interop and WIA debugging read these two articles:

Asynchronous Transfer and Events

Some devices, especially photo-cameras on serial COM ports, are slow! So it will take many seconds to transfer pictures. WIA Scripting solves this issue with an asynchronous flag when using Item.Transfer:

// asynchronously transfer picture to file
wiaItem.Transfer( imageFileName, true );

To notify the application about the completed transfer and more, the WIA manager exposes three events:

  • OnTransferComplete - file transfer completed
  • OnDeviceDisconnected - a device was e.g. unplugged
  • OnDeviceConnected - a new device was connected

These events nicely map on to the .NET event/delegate model, so we add a handler function like so:

// delegate member variable
private _IWiaEvents_OnTransferCompleteEventHandler 

// create event delegate
wiaEvtTransfer = new _IWiaEvents_OnTransferCompleteEventHandler(
                         this.wia_OnTransferComplete );

// subscribe to event
wiaManager.OnTransferComplete += wiaEvtTransfer;

// event handler function (callback from WIA!)
public void wia_OnTransferComplete( 
    WIALib.Item item, string path )
  ... // logic to handle completed transfer


For web cams or other video devices, WIA on Windows XP has a great new feature: live video stream overlay! It uses DirectShow to draw the overlay on the graphics card. The IWiaVideo interface can be accessed by importing another COM type library: "WiaVideo 1.0 Type Library" (wiavideo.dll). Unfortunately, the embedded TLB has a bug for methods passing a window handle. I used ILDASM to get the IL code of the interop assembly, then I changed all incorrect occurances of 'valuetype _RemotableHandle&' to 'native int', then finally compiled back to an assembly with ILASM. This repaired DLL is included in the download as WIAVIDEOLib.dll.

The code to show a real-time and live video stream in a window could be as simple as these two steps:

wiaVideo = new WiaVideoClass();
    wiaDeviceID, window.Handle, 0, 1 );

and to take a snapshot jpeg image from the current video stream is possible with one single method:

// this string will get the filename of the picture...
string jpgFile;            

// call IWiaVideo::TakePicture
wiaVideo.TakePicture( out jpgFile );

Check the included video sample for more!


Full source code with Visual Studio .NET projects are provided for these samples:

  • WiaEasyImage very simple application to access WIA scanners and cameras.
  • WiaEasyVideo application only using WIA video devices, does show live video stream overlay.
  • WiaScriptSample advanced application using most of WIA Scripting functions.


  • Again, for Windows XP only! if you need .NET imaging for older systems, try this TWAIN sample
  • Windows ME has an older version of WIA, but you can't use the same code/type-lib from these samples for that version.
  • WIA devices must be fully detected and configured by Windows.
  • As far as I know, WIA needs your app to have the [STAThread] attribute on the Main() method used to launch your application.
  • Item.Thumbnail was left out as it uses an undocumented Asynchronous Pluggable Protocol (APP) and has bugs.
  • Code was only tested with an Olympus digi-cam, an Epson scanner, a Logitech QuickCam, and a Sony DV CamCorder.


This article, along with any associated source code and files, is licensed under A Public Domain dedication


About the Author

Web Developer
Switzerland Switzerland
No Biography provided

You may also be interested in...

Comments and Discussions

QuestionIllTry it Pin
Member 786391326-May-13 6:33
memberMember 786391326-May-13 6:33 
QuestionNot at all working Pin
Raghavendra Rao 55828-Feb-13 20:15
memberRaghavendra Rao 55828-Feb-13 20:15 
QuestionHow to download WIAlib Pin
Member 962276729-Dec-12 5:58
memberMember 962276729-Dec-12 5:58 
AnswerRe: How to download WIAlib Pin
Member 115791143-Apr-15 8:27
memberMember 115791143-Apr-15 8:27 
QuestionWIA scanner prompts for Pin
Member 950246228-Nov-12 4:15
memberMember 950246228-Nov-12 4:15 
GeneralMy vote of 5 Pin
Aafaq Ahmed27-Sep-12 5:58
memberAafaq Ahmed27-Sep-12 5:58 
QuestionChange the picture size Pin
Somchai9K20-Sep-12 23:22
memberSomchai9K20-Sep-12 23:22 
QuestionRe: Change the picture size Pin
Somchai9K21-Sep-12 16:35
memberSomchai9K21-Sep-12 16:35 
QuestionError Pin
satish hirpara1-Sep-12 2:41
membersatish hirpara1-Sep-12 2:41 
Questionusing WIALib; ?? Pin
Roger C Garrett11-Jul-12 12:44
memberRoger C Garrett11-Jul-12 12:44 
AnswerRe: using WIALib; ?? Pin
Pepin z Hane23-Sep-12 5:58
memberPepin z Hane23-Sep-12 5:58 
GeneralRe: using WIALib; ?? Pin
Member 115791143-Apr-15 8:34
memberMember 115791143-Apr-15 8:34 
GeneralMy vote of 5 Pin
rajibdebslg8-Mar-12 6:37
memberrajibdebslg8-Mar-12 6:37 
GeneralMy vote of 5 Pin
manoj kumar choubey26-Feb-12 18:23
membermanoj kumar choubey26-Feb-12 18:23 
kunalraj8-Jan-12 8:07
memberkunalraj8-Jan-12 8:07 
QuestionAbout Wia Pin
kunalraj8-Jan-12 8:05
memberkunalraj8-Jan-12 8:05 
Questionit dos not work in windows 7 Pin
chieto1-Jan-12 14:43
memberchieto1-Jan-12 14:43 
AnswerRe: it dos not work in windows 7 Pin
LAcike@sk30-Aug-12 3:12
memberLAcike@sk30-Aug-12 3:12 
GeneralMy vote of 5 Pin
Jenka19806-Dec-11 3:12
memberJenka19806-Dec-11 3:12 
QuestionException thrown from WiaEasyVideo Pin
Member 823487314-Sep-11 16:05
memberMember 823487314-Sep-11 16:05 
I know it's been a long time since this article was published, but here's hoping that the author is still around, or someone can address this.

I downloaded the WiaEasyVideo and converted it for use with Visual Studio C# 2008 Express Version. It compiles without error, but when I run it an exception gets thrown from within the CreateCamera method:

private bool CreateCamera()
	bool done = false;
	CollectionClass wiaDevs = null;
	DeviceInfoClass devInfo = null;
	try {
		wiaManager = new WiaClass();
		object foundID = null;
		int foundCount = 0;
		wiaDevs = wiaManager.Devices as CollectionClass;		// call Wia.Devices to get all devices
		if( wiaDevs != null )
			foreach( object wiaObj in wiaDevs )
				devInfo = (DeviceInfoClass) Marshal.CreateWrapperOfType( wiaObj, typeof(DeviceInfoClass) );
				Marshal.ReleaseComObject( wiaObj );
				if( devInfo.Type.IndexOf( "Video" ) > 0 )

The exception gets thrown while executing the above statement, where it's trying to make use of the "Type" member of the devInfo object. As far as I can tell the failure actually occurs in the immediately preceding statement where it's attempting to convert the wiaObj object into the devInfo object.

Any suggestions would be welcome.
AnswerRe: Exception thrown from WiaEasyVideo Pin
Member 823487315-Sep-11 12:41
memberMember 823487315-Sep-11 12:41 
QuestionCouldn't download the source code Pin
akul1231-Aug-11 1:34
memberakul1231-Aug-11 1:34 
QuestionADF Scanning Pin
ivo753-Jul-11 2:46
memberivo753-Jul-11 2:46 
GeneralProgressCallback Pin
JDHoster10-May-11 19:46
memberJDHoster10-May-11 19:46 
GeneralMy vote of 5 Pin
Member 77964406-Apr-11 10:54
memberMember 77964406-Apr-11 10:54 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170424.1 | Last Updated 20 May 2002
Article Copyright 2002 by NETMaster
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid