分享

将Mat图像画到控件;

 zrx网 2019-06-26

将Mat图像画到控件;

void CpbtestDlg::DrawMat(cv::Mat & img, UINT nID)
{
 cv::Mat imgTmp;
 CRect rect;
 GetDlgItem(nID)->GetClientRect(&rect);  // 获取控件大小
 cv::resize(img, imgTmp, cv::Size(rect.Width(), rect.Height()));// 缩小或放大Mat并备份

 // 转一下格式 ,这段可以放外面,
 switch (imgTmp.channels())
 {
 case 1:
  cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY单通道
  break;
 case 3:
  cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA);  // BGR三通道
  break;
 default:
  break;
 }

 int pixelBytes = imgTmp.channels()*(imgTmp.depth() + 1); // 计算一个像素多少个字节
 // 制作bitmapinfo(数据头)
 BITMAPINFO bitInfo;
 bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;
 bitInfo.bmiHeader.biWidth = imgTmp.cols;
 bitInfo.bmiHeader.biHeight = -imgTmp.rows;
 bitInfo.bmiHeader.biPlanes = 1;
 bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 bitInfo.bmiHeader.biCompression = BI_RGB;
 bitInfo.bmiHeader.biClrImportant = 0;
 bitInfo.bmiHeader.biClrUsed = 0;
 bitInfo.bmiHeader.biSizeImage = 0;
 bitInfo.bmiHeader.biXPelsPerMeter = 0;
 bitInfo.bmiHeader.biYPelsPerMeter = 0;
 // Mat.data + bitmap数据头 -> MFC
 CDC *pDC = GetDlgItem(nID)->GetDC();
 ::StretchDIBits(
  pDC->GetSafeHdc(),
  0, 0, rect.Width(), rect.Height(),
  0, 0, rect.Width(), rect.Height(),
  imgTmp.data,
  &bitInfo,
  DIB_RGB_COLORS,
  SRCCOPY
  );
 ReleaseDC(pDC);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多