S
SESDev
I am trying to learn how to use Windows Image Acquisition (WIA) so that I can
use it to capture images from a webcam and process them.
I've checked out the documentation online and worked my way through the 'How
to use Filters' examples. These are all for VBScript and I want to write my
code in C# so I started by converting the samples to C# - the code is shown
below in NUnit tests; those tests marked with the Ignore attribute do not
work and I cannot figure them out. (if you do try them you will of course
need to change the image names to work on your machine).
Please help! This is just the first hurdle I've come - I've searched around
online and there is not much out there for WIA 2 (I am using Vista and
VS2008). I need to get the final tests working.
I'm sure once I get this going I'll have more questions when it comes to
working with devices.
(I've used code to capture images with DirectShow.Net, but am told that WIA
is the way things are going and want to do things the right way - hence
trying to get to grips with WIA).
Thanks in advance for your help!
The code for your reference ...
[TestFixture()]
public class MyFixture
{
private string imageFileName =
@"C:\Users\Shaun.Venus\Pictures\IMG_3623.jpg";
private string stampImageFileName =
@"C:\Users\Shaun.Venus\Pictures\NewImage_Scale.jpg";
[Test()]
public void A_RotateImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"RotateFlip";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"RotationAngle";
Object pv1 = (Object)90;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_RotateFlip.jpg", img);
}
[Test()]
public void B_CropImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Crop";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"Left";
Object pv1 = (Object)(img.Width/4);
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"Top";
Object pv2 = (Object)(img.Height / 4);
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
Object p3 = (Object)"Right";
Object pv3 = (Object)(img.Width / 4);
ip.Filters[1].Properties.get_Item(ref p3).set_Value(ref pv3);
Object p4 = (Object)"Bottom";
Object pv4 = (Object)(img.Height / 4);
ip.Filters[1].Properties.get_Item(ref p4).set_Value(ref pv4);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Crop.jpg",
img);
}
[Test()]
public void C_ScaleImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Scale";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"MaximumWidth";
Object pv1 = (Object)250;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"MaximumHeight";
Object pv2 = (Object)250;
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Scale.jpg", img);
}
[Test()]
public void D_StampImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageFile img2 = new WIA.ImageFile();
img2.LoadFile(stampImageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Stamp";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"ImageFile";
Object pv1 = (Object)img2;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"Left";
Object pv2 = (Object)(img.Width - img2.Width);
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
Object p3 = (Object)"Top";
Object pv3 = (Object)(img.Height - img2.Height);
ip.Filters[1].Properties.get_Item(ref p3).set_Value(ref pv3);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Stamp.jpg", img);
}
[Test()]
[Ignore()]
public void E_ExifFilter_WriteTextToImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
WIA.Vector vector = new WIA.Vector();
Object ix1 = (Object)"Exif";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"ID";
Object pv1 = (Object)40091;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"Type";
Object pv2 =
(Object)WIA.WiaImagePropertyType.VectorOfBytesImagePropertyType;
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
String title = "This 'Title' was added using WIA 2.0";
Boolean resizable = true;
Boolean unicode = true;
vector.SetFromString(title, resizable, unicode);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Exif.jpg",
img);
}
[Test()]
[Ignore()]
public void F_FrameFilter()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageFile page2 = new WIA.ImageFile();
page2.LoadFile(@"C:\Users\Shaun.Venus\Pictures\IMG_3582.jpg");
WIA.ImageFile page3 = new WIA.ImageFile();
page3.LoadFile(@"C:\Users\Shaun.Venus\Pictures\IMG_3583.jpg");
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Frame";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, ip.Filters.Count);
Object p1 = (Object)"ImageFile";
Object pv1 = (Object)page2;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p1).set_Value(ref pv1);
Object ix2 = (Object)"Frame";
WIA.FilterInfo fi2 = ip.FilterInfos.get_Item(ref ix2);
ip.Filters.Add(fi2.FilterID, ip.Filters.Count);
Object p2 = (Object)"ImageFile";
Object pv2 = (Object)page3;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p2).set_Value(ref pv2);
Object ix3 = (Object)"Convert";
WIA.FilterInfo fi3 = ip.FilterInfos.get_Item(ref ix3);
ip.Filters.Add(fi3.FilterID, ip.Filters.Count);
Object p3 = (Object)"FormatID";
Object pv3 = (Object)WIA.FormatID.wiaFormatTIFF;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p3).set_Value(ref pv3);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Frame.jpg", img);
img.ActiveFrame = img.FrameCount;
WIA.Vector v = img.ARGBData;
img = v.get_ImageFile(img.Width, img.Height);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Frame.bmp", img);
}
[Test()]
[Ignore()]
public void G_ARGBFilter()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
WIA.Vector v = img.ARGBData;
for (int i = 0; i < v.Count; i = i + 21)
{
if (i < v.Count)
{
//v = 0xFFFF00FF;
}
}
Object ix1 = (Object)"ARGB";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"ARGBData";
Object pv1 = (Object)v;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_ARGB.jpg",
img);
}
[Test()]
public void H_Convert()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Convert";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, ip.Filters.Count);
Object p1 = (Object)"FormatID";
Object pv1 = (Object)WIA.FormatID.wiaFormatBMP;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p1).set_Value(ref pv1);
Object p2 = (Object)"Quality";
Object pv2 = (Object)5;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p2).set_Value(ref pv2);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Convert.bmp", img);
}
private void SaveNewImage(string fileName, WIA.ImageFile img)
{
File.Delete(fileName);
img.SaveFile(fileName);
}
}
use it to capture images from a webcam and process them.
I've checked out the documentation online and worked my way through the 'How
to use Filters' examples. These are all for VBScript and I want to write my
code in C# so I started by converting the samples to C# - the code is shown
below in NUnit tests; those tests marked with the Ignore attribute do not
work and I cannot figure them out. (if you do try them you will of course
need to change the image names to work on your machine).
Please help! This is just the first hurdle I've come - I've searched around
online and there is not much out there for WIA 2 (I am using Vista and
VS2008). I need to get the final tests working.
I'm sure once I get this going I'll have more questions when it comes to
working with devices.
(I've used code to capture images with DirectShow.Net, but am told that WIA
is the way things are going and want to do things the right way - hence
trying to get to grips with WIA).
Thanks in advance for your help!
The code for your reference ...
[TestFixture()]
public class MyFixture
{
private string imageFileName =
@"C:\Users\Shaun.Venus\Pictures\IMG_3623.jpg";
private string stampImageFileName =
@"C:\Users\Shaun.Venus\Pictures\NewImage_Scale.jpg";
[Test()]
public void A_RotateImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"RotateFlip";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"RotationAngle";
Object pv1 = (Object)90;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_RotateFlip.jpg", img);
}
[Test()]
public void B_CropImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Crop";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"Left";
Object pv1 = (Object)(img.Width/4);
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"Top";
Object pv2 = (Object)(img.Height / 4);
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
Object p3 = (Object)"Right";
Object pv3 = (Object)(img.Width / 4);
ip.Filters[1].Properties.get_Item(ref p3).set_Value(ref pv3);
Object p4 = (Object)"Bottom";
Object pv4 = (Object)(img.Height / 4);
ip.Filters[1].Properties.get_Item(ref p4).set_Value(ref pv4);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Crop.jpg",
img);
}
[Test()]
public void C_ScaleImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Scale";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"MaximumWidth";
Object pv1 = (Object)250;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"MaximumHeight";
Object pv2 = (Object)250;
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Scale.jpg", img);
}
[Test()]
public void D_StampImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageFile img2 = new WIA.ImageFile();
img2.LoadFile(stampImageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Stamp";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"ImageFile";
Object pv1 = (Object)img2;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"Left";
Object pv2 = (Object)(img.Width - img2.Width);
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
Object p3 = (Object)"Top";
Object pv3 = (Object)(img.Height - img2.Height);
ip.Filters[1].Properties.get_Item(ref p3).set_Value(ref pv3);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Stamp.jpg", img);
}
[Test()]
[Ignore()]
public void E_ExifFilter_WriteTextToImage()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
WIA.Vector vector = new WIA.Vector();
Object ix1 = (Object)"Exif";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"ID";
Object pv1 = (Object)40091;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
Object p2 = (Object)"Type";
Object pv2 =
(Object)WIA.WiaImagePropertyType.VectorOfBytesImagePropertyType;
ip.Filters[1].Properties.get_Item(ref p2).set_Value(ref pv2);
String title = "This 'Title' was added using WIA 2.0";
Boolean resizable = true;
Boolean unicode = true;
vector.SetFromString(title, resizable, unicode);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Exif.jpg",
img);
}
[Test()]
[Ignore()]
public void F_FrameFilter()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageFile page2 = new WIA.ImageFile();
page2.LoadFile(@"C:\Users\Shaun.Venus\Pictures\IMG_3582.jpg");
WIA.ImageFile page3 = new WIA.ImageFile();
page3.LoadFile(@"C:\Users\Shaun.Venus\Pictures\IMG_3583.jpg");
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Frame";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, ip.Filters.Count);
Object p1 = (Object)"ImageFile";
Object pv1 = (Object)page2;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p1).set_Value(ref pv1);
Object ix2 = (Object)"Frame";
WIA.FilterInfo fi2 = ip.FilterInfos.get_Item(ref ix2);
ip.Filters.Add(fi2.FilterID, ip.Filters.Count);
Object p2 = (Object)"ImageFile";
Object pv2 = (Object)page3;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p2).set_Value(ref pv2);
Object ix3 = (Object)"Convert";
WIA.FilterInfo fi3 = ip.FilterInfos.get_Item(ref ix3);
ip.Filters.Add(fi3.FilterID, ip.Filters.Count);
Object p3 = (Object)"FormatID";
Object pv3 = (Object)WIA.FormatID.wiaFormatTIFF;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p3).set_Value(ref pv3);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Frame.jpg", img);
img.ActiveFrame = img.FrameCount;
WIA.Vector v = img.ARGBData;
img = v.get_ImageFile(img.Width, img.Height);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Frame.bmp", img);
}
[Test()]
[Ignore()]
public void G_ARGBFilter()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
WIA.Vector v = img.ARGBData;
for (int i = 0; i < v.Count; i = i + 21)
{
if (i < v.Count)
{
//v = 0xFFFF00FF;
}
}
Object ix1 = (Object)"ARGB";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, 0);
Object p1 = (Object)"ARGBData";
Object pv1 = (Object)v;
ip.Filters[1].Properties.get_Item(ref p1).set_Value(ref pv1);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_ARGB.jpg",
img);
}
[Test()]
public void H_Convert()
{
WIA.ImageFile img = new WIA.ImageFile();
img.LoadFile(imageFileName);
WIA.ImageProcess ip = new WIA.ImageProcess();
Object ix1 = (Object)"Convert";
WIA.FilterInfo fi1 = ip.FilterInfos.get_Item(ref ix1);
ip.Filters.Add(fi1.FilterID, ip.Filters.Count);
Object p1 = (Object)"FormatID";
Object pv1 = (Object)WIA.FormatID.wiaFormatBMP;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p1).set_Value(ref pv1);
Object p2 = (Object)"Quality";
Object pv2 = (Object)5;
ip.Filters[ip.Filters.Count].Properties.get_Item(ref
p2).set_Value(ref pv2);
img = ip.Apply(img);
SaveNewImage(@"C:\Users\Shaun.Venus\Pictures\NewImage_Convert.bmp", img);
}
private void SaveNewImage(string fileName, WIA.ImageFile img)
{
File.Delete(fileName);
img.SaveFile(fileName);
}
}