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

 我来答
就烦条0o
推荐于2017-12-16 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46490
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
//打开磁盘上位图文件
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);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式