opencv2.2 和 2.3 在MFC中显示图像

来源:互联网 发布:淘宝返利机器人在哪买 编辑:程序博客网 时间:2024/06/01 16:14
int showImage(Mat *workImg, CDC *pDC,int flag){ //======建立位图信息===========  int width, height, depth,channel; width = workImg->cols;; height = workImg->rows; depth = workImg->depth(); channel = workImg->channels(); int bits,colors,i; bits = (8<<(depth/2)) * channel; if (bits>8) colors=0; else colors=1<<bits; if (bits == 24) {  bits = 32; } //位图的头 BITMAPINFOHEADER BIH={40, 0, 0, 1, 8, BI_RGB , 0, 0, 0, 0, 0}; //BIH.biSize = 40; BIH.biWidth = width; BIH.biHeight = height; //BIH.biPlanes = 1;  BIH.biBitCount = bits;//表示颜色用到的位数 //BIH.biCompression = BI_RGB; //BIH.biSizeImage=0;//图像数据站的字节数,Specifies the size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps.  //BIH.biXPelsPerMeter = 0; //BIH.biYPelsPerMeter = 0; //BIH.biClrUsed = 0; //BIH.biClrImportant = 0; //  建立位图信息 LPBITMAPINFO lpBmi; lpBmi=(LPBITMAPINFO) malloc(40+4*colors); memcpy(lpBmi,&BIH,40);                  //  复制位图信息头 if (bits==8) {                          //  256 色位图  if (flag==1) {                      //  设置灰阶调色板   for (i=0;i<256;i++) {    VgaColorTab[i].rgbRed=VgaColorTab[i].rgbGreen=     VgaColorTab[i].rgbBlue=(BYTE) i;   }   memcpy(lpBmi->bmiColors,VgaColorTab,1024);  }  else if (flag==2) {                 //  设置默认调色板   memcpy(lpBmi->bmiColors,VgaDefPal,1024);  }  else if (flag==3) {                 //  设置自定义调色板   memcpy(lpBmi->bmiColors,VgaColorTab,1024);  } } //======颠倒数据 //======Mat 中从上往下存,而bitmap中从下往上存。  都是从左往右,并且bitmap每一个点多占一个保留字节,默认255  unsigned char *m_pDibBits;//存储图像中的数据,从下向上,从左向右 //x行 * Y列 int x,y;  unsigned char * bmpdata; unsigned char * imgData = workImg->data; if (bits == 8) {  m_pDibBits = new unsigned char[width * height];  //把imgData中的第一行复制到  m_pDibBits 的最后一行,依次颠倒  for (x=0;  x<height;  x++ )  {   bmpdata = m_pDibBits + (height-1-x)*width;   memcpy(bmpdata,imgData,width);   imgData = imgData + width;  } }  else if (bits == 32) {  m_pDibBits = new unsigned char[ width * height*4 ];  //把imgData中的第一行复制到  m_pDibBits 的最后一行,依次颠倒  for (x=0;  x<height;  x++ )  {   bmpdata = m_pDibBits + (height-1-x)*width*4;   for (y = 0; y<width; y++)   {    memcpy(bmpdata,imgData,3);    bmpdata[3] = 255;    bmpdata = bmpdata+4;    imgData = imgData+3;   }      } }  //======显示图像 SetStretchBltMode(pDC->m_hDC,HALFTONE);//防止自适应窗口图像显示失真 StretchDIBits(pDC->m_hDC,0, 0, width, height, 0, 0,   width, height, m_pDibBits, lpBmi, BI_RGB, SRCCOPY); delete []m_pDibBits; //TRACE("显示之后大小:%d",*img); /*namedWindow("ss",WINDOW_AUTOSIZE); imshow("ss",*img);*/ return TRUE; }

只需要在onDraw()函数中调用上述函数即可
例如:
Mat img;
img = imread("lena.jpg");
if( !img.data)
{
  return;
}
showImage(&img, pDC);
原创粉丝点击