如何在MFC中加载BMP图,并进行处理

如题所述

第1个回答  推荐于2017-12-16
//打开磁盘上位图文件
void CMyBitmapView::OnFileOpen()
{

// TODO: Add your command handler code here

CFileDialog fileDlg(TRUE);

fileDlg.m_ofn.lpstrTitle = "我的位图打开对话框";

fileDlg.m_ofn.lpstrFilter = "Text Files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";

if (IDOK==fileDlg.DoModal())

{

m_sourcefile = fileDlg.GetFileName();

}

Invalidate(TRUE); //重绘
}

//处理位图
void CMyBitmapView::OnMakeBmp()
{

// TODO: Add your command handler code here

CFile file(m_sourcefile,CFile::modeRead);

//BYTE* sourcebuf;

//提取原图文件头

file.Read((void*)&sourcefileheader,sizeof(BITMAPFILEHEADER));

//提取文件信息头

file.Read((void*)&sourceinfoheader,sizeof(BITMAPINFOHEADER));

//这里是因为BMP规定保存时长度和宽度必须是4的整数倍,如果不是则要补足

int Width,Height,i,j,k;

Width=(sourceinfoheader.biWidth/4)*4;

if(Width<sourceinfoheader.biWidth)

Width=Width+4;

Height=(sourceinfoheader.biHeight/4)*4;

if(Height<sourceinfoheader.biHeight)

Height=Height+4;

sourcebuf=(BYTE*)malloc(Width*Height*3);

//读取原图的颜色矩阵像素

file.Read(sourcebuf,Width*Height*3);

file.Close();

BYTE* targetbuf;

targetbuf=(BYTE*)malloc(Width*Height*3);

for(i=1;i<Height-1;i++) // 每行

{

for(j=1;j<Width-1;j++) // 每列

{
for (k=0; k<3; k++)
{

targetbuf[(i*Width+j)*3+k] = sourcebuf[(i*Width+j)*3+k] - sourcebuf[((i-1)*Width+(j+1))*3+k] +128;

if (targetbuf[(i*Width+j)*3+k]>255)

targetbuf[(i*Width+j)*3+k] = 255;

if (targetbuf[(i*Width+j)*3+k]<0)

targetbuf[(i*Width+j)*3+k] = 0;
}

}

}

CFile file1(m_sourcefile,CFile::modeCreate | CFile::modeWrite);

//file.SeekToBegin();

//写入保存位图文件头

file1.Write((void*)&sourcefileheader,sizeof(BITMAPFILEHEADER));

//写入保存位图信息头

file1.Write((void*)&sourceinfoheader,sizeof(BITMAPINFOHEADER));

//写入保存位图的颜色矩阵像素

file1.Write(targetbuf,Width*Height*3);

//关闭位图文件

file1.Close();

//重绘

Invalidate(TRUE);

// 释放内存

free( sourcebuf );

free( targetbuf );
}

//显示位图
void CMyBitmapView::OnDraw(CDC* pDC)
{

CMyBitmapDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

HBITMAP bitmap;

//读取制定路径的位图文件

bitmap=(HBITMAP)LoadImage(

AfxGetInstanceHandle(),

m_sourcefile,

IMAGE_BITMAP,

0,

0,

LR_LOADFROMFILE|LR_CREATEDIBSECTION

);

//创建兼容的设备描述表

HBITMAP OldBitmap;

CDC MemDC;

MemDC.CreateCompatibleDC(pDC);

CRect rect;

GetClientRect(rect);

//位图选入兼容DC中

OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
//绘制位图

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);

MemDC.SelectObject(OldBitmap);
}本回答被网友采纳

mfc导入不了bmp图片
1、建一个单文档的MFC程序。2、插入->资源->Bitmap->导入。3、插入->资源->对话框->新建。4、找到图片控件。5、在对话框的空白处画一个矩形。6、右键->属性。7、双击对话空,建立一个对话空的类,取名(比如:Tupian)->确定。8、在resources中点开menu。9、增加一个菜单项,右键属性。10、...

MFC中如何载入bmp和jpeg格式的图片,并作为文件背景
步骤一:导入bmp文件:第二步:设置为背景:① 添加OnCtlColor消息响应函数:② 添加响应代码:HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);\/\/ TODO: Change any attributes of the DC here static CBrush gBr;...

在使用mfc中载入bmp图像带,怎么做?
用GDI+解决这个问题比较容易,一个循环,每次新建1个HBITMAP(MFC里面新建CBitmap以后应该可以从中获得HBITMAP),然后从HBITMAP创建Graphics对象,用DrawImage方法把你这个图像带的一个部分画进去(DrawImae的参数里你可以指定要画哪个部分),完了调用一下Graphics的Flush方法。循环四次就把四个图像分开...

mfc 加载图片资源怎么弄?给个程序最好附上说明。
如果想把外部图片导入MFC资源库,可以在资源视图点右键,添加资源,选择插入,找到你的bmp文件,点确定,这样图片就进到资源列表了.如果想给让一个图片显示出来,可以使用兼容DC.写个例子给你 为准备要显示图片的窗口添加一个WM_ERASEBKGND消息,然后mfc自动帮你加上如下函数,在里面写上内容就行了,给...

求MFC中打开BMP,并能进行二值化处理程序
输入:strImgFilename 待处理图像文件名 strBmpFilename bmp图像名 thresholdValue 256级灰度值的阈值(函数会先将图像转换成灰度再根据thresholdValue做黑白2值化)输出:lVC连接Lib方式声明 __declspec(dllexport)int WINAPI icePub_imgToSingleBmp(char *strImgFilename,char *strBmpFilename,int threshold...

用MFC编程打开24位真彩BMP图像,然后获取鼠标点的RGB值
打开图像的话,首先获取bmp的像素矩阵,然后用bitblit复制到内存dc上,再复制到窗口dc上,即可。鼠标的问题,在onclick事件中处理,算一下鼠标点击位置的坐标,然后相对于bmp在窗口中的位置,计算出点击位置在bmp像素矩阵中的坐标,然后从bmp像素矩阵获取对应的各个像素rgb值,计算平均数,然后调用对话框...

...做一个基于对话框的MFC程序,从内存读取BMP图像并显示,刚刚接触不知 ...
LoadImage(AfxGetInstanceHandle(), CString("C:\\\\Users\\\\lenovo\\\\Desktop\\\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);这是你要的函数。看一下我给你的例子,本例子是动态加载突变显示随着鼠标移动(防闪烁)。但是这个是VS2012运行的工程:你看CDanamicLoadView::OnCreate中动态加载图片...

mfc中图片控件如何显示图片
在资源视图里面加载图片(只能是bmp格式的图片),然后在图片控件属性设置里面有设置图片资源id的下拉框里面选择要显示的图片id即可,如果要显示其他图片格式,需要自己编码实现,这样就没有必要使用图片控件。

MFC程序里如何插入图片
{ CBitmap bitmap;\/\/这里先建立一个位图对象 bitmap.LoadBitmap(IDB_BKGROUND); \/\/这里使用根本图像在资源中的ID加载图像到对象中 BITMAP bmp;\/\/这里建立一个位图结构体主要是用来取位图的长宽值的 bitmap.GetBitmap(&bmp);\/\/这里就是将位图对象中的图像资料放进这个结构体中 CDC dcCom;\/\/...

MFC 显示内存中的BMP 结构到PIC控件的问题,没有显示成功,已知BMP像素数...
我是用以下方法加载BMP图像的,你看看能用在你那上面吗?直接用LoadImage函数就好了。\/\/ 加载位图 HBITMAP hBitmap;hBitmap= (HBITMAP)LoadImage(NULL, "107.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);if(hBitmap == NULL){ MessageBox(hwnd,"LoadImage failed", "...

相似回答