以相机采集图像为例
一、如果采集到的图像是灰度的,则:
//采集灰度图像 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);
二、如果采集到的图像是彩色的,则:
后续添加