使用相機SDK採圖的話很多時候得到的是一個數據流(byte[])或者指針IntPtr,單通道圖像格式轉換採用gen_image1來實現,三通道圖像可以採用gen_image3函數來實現。
//命名空間
using System;
using System.Drawing;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using HalconDotNet;
using System.Drawing.Imaging;
…………………………………………………………………………………………………………………………
//這裏的Image.Buffer是byte[],由於裏面還包含了相機型號等其它信息,不能直接拿來操作
MemoryStream buffer = new MemoryStream(Image.Buffer);
Bitmap bmp = new Bitmap(buffer);//用BitMap做中轉
this.pictureBox1.Image = bmp;
HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, bmp.Height, bmp.Width);
HObject halcon_image;
BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);//鎖定BitMap
byte[] arrayR = new byte[bmp_data.Width * bmp_data.Height];//紅色數組
byte[] arrayG = new byte[bmp_data.Width * bmp_data.Height];//綠色數組
byte[] arrayB = new byte[bmp_data.Width * bmp_data.Height];//藍色數組
byte* pBmp = (byte*)bmp_data.Scan0;//BitMap的頭指針
//下面的循環分別提取出紅綠藍三色放入三個數組
for (int R = 0; R < bmp_data.Height; R++)
{
for (int C = 0; C < bmp_data.Width; C++)
{
//因爲內存BitMap的儲存方式,行寬用Stride算,C*3是因爲這是三通道,另外BitMap是按BGR儲存的
byte* pBase = pBmp + bmp_data.Stride * R + C * 3;
arrayR[R * bmp_data.Width + C] = *(pBase + 2);
arrayG[R * bmp_data.Width + C] = *(pBase + 1);
arrayB[R * bmp_data.Width + C] = *(pBase);
}
}
//得到三個數組的頭指針,C#特色
fixed (byte* pR = arrayR, pG = arrayG, pB = arrayB)
{
HOperatorSet.GenImage3(out halcon_image, "byte", bmp_data.Width, bmp_data.Height,
new IntPtr(pR), new IntPtr(pG), new IntPtr(pB));
//如果這裏報錯,仔細看看前面有沒有寫錯
}
bmp.UnlockBits(bmp_data);//用完了一定要解除鎖定
HOperatorSet.DispObj(halcon_image, this.hWindowControl1.HalconWindow);
HOperatorSet.WriteImage(halcon_image, "bmp", 0, "Halcon_Image.bmp");//這個bmp文件很大