C++MFC打开图片、彩图,以及对图像进行简单算法处理

VS2010 C++基于MFC对话框的一些应用程序的处理及遇到问题的解决方法

一、创建MFC的基本步骤

1.新建项目
在这里插入图片描述
2.创建一个MFC工程
在这里插入图片描述
3.对工程进行修改名称以及路径,点击确定
在这里插入图片描述
4.点击下一步
在这里插入图片描述
5.这里点击基于对话框,然后点击下一步
在这里插入图片描述
6.这里默认,点击下一步
在这里插入图片描述
7.这里也是默认, 点击下一步
在这里插入图片描述
8.这里类名选择APP,然后点击完成
在这里插入图片描述
9.这里就会生成一个对话框, 点击然后删除控件
在这里插入图片描述
10.点击右边的工具箱,添加两个picture控件(Picture Control)和一个按钮控件(Button)
在这里插入图片描述

在这里插入图片描述
11.更改这三个控件的ID,选中然后右键点击属性,改完ID后点击enter键

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
二、添加变量
1.右键点击两个picture控件,添加control变量,变量类型为CStatic,变量名分别为m_picture1和m_picture2
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.右键对话框,添加成员变量,变量类型为CString,变量名strFilePath和strFileName
在这里插入图片描述

在这里插入图片描述

3.点击右键查看类向导,点击成员变量可以看到添加的变量
在这里插入图片描述

4.更改配置属性
点击项目→属性→配置属性→把使用unicode字符集更改成使用多字节字符集,然后点击确定
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、添加代码
1.双击Button(开始)控件,会出现代码
在这里插入图片描述
2.在这里面添加代码
在这里插入图片描述
①打开图片

CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*|"), this);
    fileDlg.DoModal();
	strFilePath=fileDlg.GetPathName();		//文件路径
	strFileName = fileDlg.GetFileName();	//文件名
	if (strFilePath == _T(""))
    {
        return;
    }
    
	CImage image;
    image.Load(strFilePath);
CRect rectControl;                        //控件矩形对象
	m_picture1.GetClientRect(rectControl);
	CDC *pDc = m_picture1.GetDC();			 //设备上下文对象的类
	rectControl = CRect(rectControl.TopLeft(), CSize((int)rectControl.Width(), (int)rectControl.Height()));
	m_picture1.SetBitmap(NULL);				//清空picture
	image.Draw(pDc->m_hDC, rectControl);    //将图片绘制到Picture控件表示的矩形区域
	image.Destroy();
	m_picture1.ReleaseDC(pDc);

②点击运行,双击开始按钮即可打开图片
在这里插入图片描述
在这里插入图片描述
③图像处理
对图像进性二值化处理,在头文件上添加#include “vector”,然后在上面代码的基础上添加以下代码

using std::vector;
	byte* pRealData;
	pRealData = (byte*)image.GetBits();	//获取到图片内存点的位置
	int width = image.GetWidth();
    int height = image.GetHeight();
	int pit = image.GetPitch();			//图像每行字节数
	int bitCount = image.GetBPP() / 8;	//获取每像素的位数~~/8得到字节数
	vector <int> gray(256);			//初始化时自动存0,用来存放256种颜色出现的次数
	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			gray.at((int)(*(pRealData + pit*i + j*bitCount))) += 1;			//像素被用到的次数加一
		}
	}
	//进行二值化处理
	int max = 0;	
	int sec = 0;
	int locamax = 0;
	int locasec = 0;
	for (int i = 0; i < 256; i++)
	{
		if (gray[i] > max)
		{
			max = gray[i];	//得到被使用次数最多的像素
			locamax = i;
		}
	}
	for (int i = 0; i < 256; i++)
	{
		
		if (gray[i] > sec&&abs(i-locamax)>10)	//得到被使用次数第二多的像素
		{
			sec = gray[i];
			locasec = i;
 
		}
	}
	int min = (locamax + locasec) / 2;	//取中间值,大于中间值的变成黑色,小于中间值的变成白色
	for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			if ((int)(*(pRealData + pit*i + j*bitCount)) < min)
			{
				*(pRealData + pit*i + j*bitCount) = 0;
				*(pRealData + pit*i + j*bitCount+1) = 0;
				*(pRealData + pit*i + j*bitCount+2) = 0;
			}
			else
			{
				*(pRealData + pit*i + j*bitCount) = 255;
				*(pRealData + pit*i + j*bitCount + 1) = 255;
				*(pRealData + pit*i + j*bitCount + 2) = 255;
			}
		}
	}
	//处理完的图片显示在picture2上
	m_picture2.GetClientRect(rectControl);
	pDc = m_picture2.GetDC();
	rectControl = CRect(rectControl.TopLeft(), CSize((int)rectControl.Width(), (int)rectControl.Height()));
	m_picture2.SetBitmap(NULL);
	image.Draw(pDc->m_hDC, rectControl);                //将图片绘制到Picture控件表示的矩形区域
	image.Save(_T("D:\\图片.png"));						//将图片保存到D盘中
    image.Destroy();				//释放
	m_picture2.ReleaseDC(pDc);		//释放*/

④发现不成功,点击中止,此时需要屏蔽image.Destroy(),再次运行,就可以实现二值化处理了;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
④灰度值处理
把二值化处理的部分代码替换成以下代码即可
//灰度值处理

for (int i = 0; i < height; i++)
	{
		for (int j = 0; j < width; j++)
		{
			*(pRealData + pit*i + j*bitCount) *=0.114 ;
			*(pRealData + pit*i + j*bitCount+1) *=0.587 ;
		    *(pRealData + pit*i + j*bitCount+2) *=0.299 ;
		}
	}

在这里插入图片描述
在这里插入图片描述
⑤运行即可进性灰度值处理了
在这里插入图片描述
以上就是处理完毕了,
重要的是不要忘记了添加头文件#include"vector"和给vector的声明using std::vector;
谢谢支持!

参考文献:C++ MFC打开图片并进行简单算法处理
链接地址:https://blog.csdn.net/qq_37907622

  • 10
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值