VS2010 VC++MFC打开图像并且灰化处理

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

VS2010 VC++MFC打开图像并且灰化处理

转载原文地址:link.

因为原文代码调试的时候有些问题,所以自己添加和屏蔽了几条代码然后就能正常显示图片并灰化了(添加变量与作者原文一致)
在这里插入图片描述

第一处问题是因为vector未声明定义,得加上头文件#include “vector” ;和using namespace std;

第二处是image.Destroy(),此处把第一张图片释放了,所以在第二个picture内不会显示图像,把这句直接屏蔽,然后就能显示灰化后的图像了。

//void CUI2Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*|"), this);
    fileDlg.DoModal();
	strFilePath=fileDlg.GetPathName();		//文件路径
	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);
	
	using namespace std;
	//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);		//释放

}
MFC实现灰度直方图(附完整源码) 阅读详情

相关推荐

MFC绘制灰度地图(附完整源码)

MFC绘制灰度地图(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 748

c++ 打开图像

本例程,给出了打开常见图像的代码,对图像处理有兴趣的,可以参考代码的处理方法。

MFC实现灰度图像处理(附完整源码)

MFC实现灰度图像处理(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 415

MFC 图像处理之灰度、量化、采样处理(源码)

该资源主要参考我的博客【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解,博客地址http://blog.csdn.net/eastmount/article/details/46010637讲述VC++ 6.0关于数字图像处理的灰度、采样、量化处理处理的是BMP图片,其中含有详细注释。免费资源,希望能结合原文学习,也期望对你有所帮助,尤其是初学者!By:Eastmount

MFC几种简单的灰度线性变换

1、,建立一个ImageProcessing Wizard工程; 2、选择菜单里的工程->设置,选择C/C++选项卡,分类下拉条里选择Code Generation,然后在Struct member alignment中选择1 Byte; 3、通过CBmp类读入bmp文件; 4.给C~Dlg类添加一个成员变量CBmp* bmp; 5.在OninitDialog()内添加代码 :bmp=new CBmp; bmp->load_bmp(“C:\cat.bmp”); 6.之后,读取原图、彩色图像灰度化

飞花舞者的博客 656

C++: 通过文件流读取图片文件

C++: 通过文件流读取图片文件 读取图片文件,读到内存后,再访问内存数据,另存为图片文件,亲测有效! 代码: #include <fstream> using namespace std; void main() { //一、打开jpg文件 // 1. 打开图片文件 ifstream is("D:\\test.jpg", ifstream::in | ios::binary); // 2. 计算图片长度 is.seekg(0, is....

mengsuifengc的博客 8996

项目【MFC】总结(三)——图像灰度化/彩色化

关于界面左边的按钮事件 “上一帧”、“下一帧”、“跳转至”以及三个“编辑框显示”的功能比较简单,这里就不在记录了。需要注意的是,变量命名一定要规范,这样自己就不容易混乱。比如,原始读入的图像为Img,当前帧为Current_Img,调整帧号为Goto_farme_num等。 这一次记录一下右边的【彩色化】和【灰度化】功能,可能更加偏向图像方面而非MFC了。 灰度化 /彩色化 很简单,灰度化就是将读入的图像直接显示,这里涉及到数组转图像(Vector->Mat)。 数组转图像代码如下: ..

小武的博客 1554

【个人笔记】07 滚动条操作2.0 - 调整亮度与对比度

07 滚动条操作2.0 - 调整亮度与对比度

CSDN仅为笔记之用。 1659

MFC之 图形处理 灰度值(圆实现)

MFC有四大类,View类是在框架类之上,所以如果你需要实现画面显示之类的,就只能在VIEW类中响应. 而Doc类是用于存储数据管理的类,他们是关联关系,Doc类储存,View类显示。 另外App类和Doc类都是从CCmdTarget类派生而来,所以只能接收命令消息和控件通知消息,View类与Frame框架类都是从CWnd类派生所以能够接收命令消息和控件通知消息还有windows消息三种消息. 对

一座城池 706

mfc画图程序源代码_(初心者向け)Image Processing 图像处理程序设计

一. 程序概况程序名称:Xin's Image Processing现版本 : .ver 1.72设计环境:WIN32程序功能:完成基本的图像处理基本功能实现设计者 :ZwqXin完成用时:数不清的日夜经历版本: .ver 1.0 完成程序构架的设计,主窗口界面布局的设计,完成BMP文件操作类OperateBMP,实现8BIT, 16BIT, 24BIT, 32BIT图片的读入,显示与保存...

weixin_39940714的博客 809

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

MFC 一、新建一个MFC工程,添加两个picture控件和一个按钮控件。 二、添加变量 1、为两个picture控件添加control变量,类型为CStatic,变量名分别为m_picture1和m_picture2. 2、添加保存图片路径和名称变量,CString类型,变量名strFilePath,strFileName 三、添加按钮消息映射函数 双击“打开图片”按钮进入消息映射函数,`在这里添加以下代码: 一、为按钮添加打开文件的功能,并默认打开.png格式的文件,并在打开文件右下角添加文件类型选项。

qq_53955363的博客 5658

QT drawPixmap和drawImage处理图片模糊问题

drawPixmap和drawImage显示图片时,如果图片存在缩放时,会出现模糊现象,例如将一个100x100 的图片显示到30x30的区域,这个时候就会出现模糊。如下: 实际图片: 这个问题就是大图显示成小图造成的像素失真。 当我们在1080的屏幕上显示清楚的图片放到2k屏幕上也可能会出现图片模糊,原因也是大图显示成小图或者显示成更大的图造成的缩放像素失真。 解决方法:按照要显示的大小,我们代码提前给它缩放处理,防止它自动缩放。 QPainter p(this); p.setPen(QColor(

weixin_43246170的博客 9479

C++读取图片文件

C++读取图片文件 这里主要讲述如何在C++编程中读取图片文件,主要介绍两种方式:一种的是C++风格,主要是采用文件流的方式,另一种是C风格,主要采用FILE类的相关操作。小面分别对两种方式进行介绍。 1、文件流读取图片文件 主要的步骤: 1、打开图片文件; 2、计算图片长度; 3、创建内存缓存区; 4、读取图片。 对应的头文件: #include <fstream> 主要用到的函数: 1、ifstream.seekg() seekg:设置输入文件流的文件流指针位置

qq_24003917的博客 2万+

C++调用显示图片

C++调用显示图片。

qq_46107892的博客 1291

用c++语言打开/保存一幅图片的代码

#include using namespace std;   void OpenAndSavePic() {  char name[50];//文件名  int length;//文件长度  char *buf;//文件内容  memset(name, 0, 50);  cout  cin >> name;  FILE * f = fopen(name, "rb");//

u012547790的专栏 3925

C++加载png图片的两种方法 - GDI+和CImage

讲述如何分别使用GDI+和CImage去加载png图片。

dvlinker的技术专栏 1万+

彩色图像灰度化MFC

彩色图像灰度化 原理 将彩色图像转换为灰度图像的过程称为灰度化处理,灰度化处理就是使彩色的R,G,B分量值相等的过程。由于R,G,B的取值范围是0-255,所以灰度的级别只有256级,所以说灰度图像仅能表现256种颜色(灰度)。 灰度化处理的方法主要有如下3种: 1).最大值法:使R,G,B的值等于3值中最大的一个,R=G=B=max(R,G,B),最大值法会形成亮度很高的灰度图像。 2).平均值...

qq_40625543的博客 2748

BMP图像的灰度化---C++实现

灰度图的结构主要包括文件头,BMP信息头,调色板,BMP数据内容四部分。灰度图的调色板共有256项RGBQUAD结构,存放0到255的灰度值,每一项rgbRed、rgbGreen、rgbBlue分量值相等。 24位真彩BMP图像的灰度化       把24位真彩BMP图像转变成256阶灰度图的具体步骤如下: (1) 修改信息头        信息头共有11部分,灰度化时需要修改

keep_moving_cqu的专栏 1万+
Two1ce
博客等级 码龄5年 1粉丝 0原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值