以相机采集图像为例
一、如果采集到的图像是灰度的,则:
//采集灰度图像
GrabImageAsync(&ho_Image, hv_AcqHandle, -1);
//获取图像单通道指针hv_Pointer
GetImagePointer1(GrayImag,&hv_Pointer,&hv_Type,&hv_Width1,&hv_Height1);
//获取图片大小
//将halcon类型的控制变量强制转换
Width = (Hlong)hv_Width1;
Height = (Hlong)hv_Height1;
//专门放灰度的指针
p = (BYTE *)hv_Pointer[0].L();
if(m_kong)
{
//pt = new BYTE(Width*Height);
//因为是灰度图,一个像素占一个字节
//为这个指针装halcon图像的单通道指针动态分配内存空间
pImage = new BYTE[Width*Height];
//将bool类型变量置为零,不让其一直申请内存空间
m_kong = FALSE;
}
//将数据转到分配好空间的指针 pImage中
memcpy(pImage,p,Width*Height*sizeof(BYTE));
//变量转换完成,开始显示
//位图信息头
//给信息头指针分配内存空间
bmpinf = (BITMAPINFO*)Buf;
//初始化BITMAPINFO结构,此结构在保存bmp文件,显示采集图像时使用
bmpinf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinf->bmiHeader.biWidth = Width;
bmpinf->bmiHeader.biHeight = -Height; //正负可以上下翻转图像
bmpinf->bmiHeader.biBitCount = 8; //每个像素占8位
bmpinf->bmiHeader.biCompression = BI_RGB;
bmpinf->bmiHeader.biSizeImage = 0;
bmpinf->bmiHeader.biClrImportant = 0;
bmpinf->bmiHeader.biClrUsed = 0;
bmpinf->bmiHeader.biXPelsPerMeter = 0;
bmpinf->bmiHeader.biYPelsPerMeter = 0;
bmpinf->bmiHeader.biPlanes = 1;
//位图颜色表:灰度图比rgb三通道图多个颜色表,它由256和结构体,第一个结构体都是0,以此类推
for(int i = 0; i<256; i++)
{
bmpinf->bmiColors[i].rgbBlue=i;
bmpinf->bmiColors[i].rgbRed=i;
bmpinf->bmiColors[i].rgbGreen=i;
//预留一般为零
bmpinf->bmiColors[i].rgbReserved=0;
}
//显示部分
CDC *pDC;
CRect Vedio;
pDC = GetDlgItem(IDC_DISPLAY_STATIC)->GetDC();
GetDlgItem(IDC_DISPLAY_STATIC)->GetClientRect(Vedio);
SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);
//显示函数
StretchDIBits(pDC->GetSafeHdc(),
Vedio.left,
Vedio.top,
Vedio.Width(),
Vedio.Height(),
0,
0,
Width, //图像宽
Height, //图像高
pImage, //图像缓冲区
bmpinf, //BMP图像描述信息
DIB_RGB_COLORS,
SRCCOPY);
GetDlgItem(IDC_DISPLAY_STATIC)->ReleaseDC(pDC);
二、如果采集到的图像是彩色的,则:
后续添加