显示:将Mat图片居中显示到MFC的picture控件上(通过StretchDIBits)

显示:将Mat图片居中显示到MFC的picture控件上(通过StretchDIBits)BOOLCXXXDlg ShowMat Matimage if image empty returnFALSE CRectrect intwidth height BITMAPINFObi BITMAPINFOHE bmiHeader width image cols height image rows

BOOL CXXXDlg::ShowMat(Mat image) { if (image.empty()) return FALSE; CRect rect; int width, height; BITMAPINFO bitmapInfo; BITMAPINFOHEADER* bmiHeader; width = image.cols; height = image.rows; if (width % 4) width = (width + 3) / 4 * 4; cv::Size winSize(width, height); cv::Mat cvImgTmp(winSize, CV_8UC3); if (image.size() != winSize) cv::resize(image, cvImgTmp, winSize); else cvImgTmp = image.clone(); if (cvImgTmp.channels()==1) cvtColor(cvImgTmp, cvImgTmp, CV_GRAY2BGR); GetDlgItem(IDC_STATIC_SHOW_MODE)->GetClientRect(&rect); bmiHeader = &bitmapInfo.bmiHeader; bmiHeader->biSize = sizeof(BITMAPINFOHEADER); bmiHeader->biWidth = cvImgTmp.cols; bmiHeader->biHeight = -cvImgTmp.rows; bmiHeader->biPlanes = 1; bmiHeader->biBitCount = 24; bmiHeader->biCompression = BI_RGB; bitmapInfo.bmiHeader.biSizeImage = 0; bmiHeader->biXPelsPerMeter = GetSystemMetrics(SM_CXSCREEN); bmiHeader->biYPelsPerMeter = GetSystemMetrics(SM_CYSCREEN); bmiHeader->biClrUsed = 0; bmiHeader->biClrImportant = 0; /*使图片在控件中居中全部显示*/ int nWindowW = rect.Width(); //获取窗口宽度 int nWindowH = rect.Height(); //获取窗口高度 int nImageW = cvImgTmp.cols; //获取图片宽度 int nImageH = cvImgTmp.rows; //获取图片高度 float fRatioW = (float)nWindowW / nImageW; float fRatioH = (float)nWindowH / nImageH; int nBeginW , nBeginH, nWeight, nHeight; if (fRatioW < fRatioH) { nBeginW = 0; nBeginH = (int)(nWindowH - (nImageH*fRatioW)) / 2; nWeight = nWindowW; nHeight = (int)(nImageH * fRatioW); } else { nBeginW = (int)(nWindowW - (nImageW*fRatioH)) / 2; nBeginH = 0; nWeight = (int)(nImageW * fRatioH); nHeight = nWindowH; } GetDlgItem(IDC_STATIC_SHOW_MODE)->GetDC()->FillSolidRect(0, 0, nWindowW, nWindowH, COLORREF(0)); GetDlgItem(IDC_STATIC_SHOW_MODE)->GetDC()->SetStretchBltMode(COLORONCOLOR); StretchDIBits(GetDlgItem(IDC_STATIC_SHOW_MODE)->GetDC()->GetSafeHdc() , nBeginW, nBeginH, nWeight, nHeight , 0, 0, nImageW, nImageH, cvImgTmp.data, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY); return TRUE; }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232969.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • T25 截图识别文字工具

    T25 截图识别文字工具截图识别文字工具

    2022年5月1日
    44
  • php熔断机制,如何保证核心链路稳定性的流控和熔断机制?

    php熔断机制,如何保证核心链路稳定性的流控和熔断机制?仅从设计优化、服务拆分、自动扩容等方面进行优化,有时候并不能完全解决问题。比如,有时流量增长过快,扩容流程还来不及完成,服务器可能就已经抗不住了既然突发流量我们没法预测,业务上也不可能不依赖任何外部服务和资源,那么有什么办法能尽量避免,或者降低出现这些问题时对核心业务的影响呢?流量控制01.流控常用的算法目前业内常用的流控方法有两种:漏桶算法和令牌桶算法漏桶算法“漏桶算法”的主要目的是控制数据注…

    2025年6月23日
    6
  • screentogif怎么做动图_iphone录屏转gif

    screentogif怎么做动图_iphone录屏转gif下载ScreenToGif可以从本身电脑的电脑管家下载,也可以百度下载,该软件轻量,方便,可自行添加水印,免费启动软件打开录像机可以调整帧数和调整要录制的屏幕区域点击-录制点击-停止另存为有保存文件的地址和名称以及其他配置可以根据情况调整保存成功…

    2026年2月1日
    4
  • Redis的各种用途以及使用场景

    Redis的各种用途以及使用场景Redis的各种用途以及使用场景

    2022年4月22日
    39
  • 手摸手教你写一个vue的toast弹窗[通俗易懂]

    手摸手教你写一个vue的toast弹窗[通俗易懂]前言:我们在项目开发的过程中,也许会在很多页面实现弹窗的消息,普通的方法就是在这每个界面写些原生js代码来控制弹窗效果,这样明显非常冗余。可通过引入组件的方式,可解决部分冗余的代码,但是每个要使用的界面都必须导入、注册、使用,这些代码还是比较冗余。通过插件的方式封装Toast,可解决每个页面重复导入、注册、使用的重复过程。一.封装Toast组件css自行设计二.Toast插件方式的封装在使用Toast前需要做相应的准备工作:添加一个index.js文件-里面定义一个对象-然后导

    2022年9月25日
    6
  • 图像gamma校正

    图像gamma校正                  图像gamma校正1.为什么要进行Gamma校正 (Gamma Correction,伽玛校正):所谓伽玛校正就是对图像的伽玛曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比度效果。计算机绘图领域惯以此屏幕输出电压与对应亮度的转换关系曲线,称为伽玛曲线…

    2022年6月16日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号