How to get Images From Scanner in C# with Windows Image Acqusition(WIA) Library

27-11-2015

Getting images from Scanner in C#, we will use ShowTransfer() method of WIA.ICommonDialog class in Windows Image Acqusition(WIA) library

Full Code

WIA.ICommonDialog dialog = new WIA.CommonDialog();
WIA.Device device = dialog.ShowSelectDevice(WIA.WiaDeviceType.UnspecifiedDeviceType, true, false);
var d = device.DeviceID;

WIA.DeviceManager manager = new WIA.DeviceManager();

foreach (WIA.DeviceInfo info in manager.DeviceInfos)
{
    if (info.DeviceID == d)
    {
        // connect to scanner
        device = WiaDeviceId.Connect();
        break;
    }
}
//First item starts with 1 not 0
Item item = device.Items[1];

//gets image from scanner
ImageFile image = (ImageFile) dialog.ShowTransfer(item, WIA.FormatID.wiaFormatTIFF, true);

var imageBytes = (byte[])image.FileData.get_BinaryData();
var ms = new MemoryStream(imageBytes);
Bitmap bitmap = (Bitmap)System.Drawing.Image.FromStream(ms);

//tiff images can contain multiple images named as frame 
int count = bitmap.GetFrameCount(FrameDimension.Page);
for (int idx = 0; idx < count; idx++)
{
    // save each frame to a bytestream
    bitmap.SelectActiveFrame(FrameDimension.Page, idx);
    MemoryStream byteStream = new MemoryStream();
    bitmap.Save(byteStream, ImageFormat.Tiff);
    
    // and then create a new Image from it
    System.Drawing.Image newImage = System.Drawing.Image.FromStream(byteStream);
    
    string filePath = System.IO.Path.GetTempPath() + "\\wiamnx" +
    DateTime.Now.ToString("yyyyMMddHHmmss.fff") + "." + image.FileExtension;
    
    newImage.Save(filePath);
}                   

If you want to scan single side or multiple side of a page,simplex or dublex, you can use following lines of codes:

deviceManager = new WIA.DeviceManager();

if (!string.IsNullOrEmpty(this.WiaDeviceName))
{
    IEnumerable<WIA.DeviceInfo> devices =
    this.deviceManager.DeviceInfos.OfType<WIA.DeviceInfo>()
    .Where(x => x.DeviceID == (string) this.WiaDeviceName);
    if (devices != null && devices.Count() > 0)
    {
        this.WiaDeviceId = devices.FirstOrDefault();
    }
}
var  device = WiaDeviceId.Connect(); //Connects to selected Scanner
device.Properties.get_Item("3088").set_Value(5); // Double scanning or dublex scanning
device.Properties.get_Item("3088").set_Value(1);// Single scanning or simplex scanning

If you want to change DPI resolution, you can use following codes:

private const int WIA_IPS_DPI_HORIZONTAL = 6147;
private const int WIA_IPS_DPI_VERTICAL = 6148;
var dpi=500;
Item item = device.Items[1]; //First item starts with 1, not 0
item.Properties.get_Item("6147").set_Value(dpi); // horizontal DPI
item.Properties.get_Item("6148").set_Value(dpi); // vertical DPI

Note: Normally ShowTransfer() method scan all pages inserted in the scanner. If you want to change this default value, you can use 3096 property as follows:

private const int WIA_IPS_PAGES = 3096;
var device = WiaDeviceId.Connect();

foreach (Property p in device.Properties)
{
    switch (p.PropertyID)
    {
        case WIA_IPS_PAGES:
        // 0 means fast scan, 1 means single page scan, 2 means double scan, dublex . 
        //And also set above 3088 property as 5
        p.set_Value(0);
        break;   
    }
}

© 2019 All rights reserved. Codesenior.COM