永发信息网

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

答案:1  悬赏:40  手机版
解决时间 2021-11-12 08:51
如何在MFC中加载BMP图,并进行处理
最佳答案
//打开磁盘上位图文件
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
Width=Width+4;

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

if(Height
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
{

for(j=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;

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

bitsrc=(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中

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

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

MemDC.SelectObject(OldBitmap);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
散水图集05J9-1-57-3室外散水做法是什么?
《重庆孤男寡女》最新txt全集下载
跪球。本人早几年在江西铅山农村造了栋房子,
求大神指导,怎么才能划出坑水很深的青铜白银
本人在清溪!谁有空过来吃饭!只要女的!
亲们谁能告诉我,为什么我在冥想或注意眉心轮
r语言用attach mask 怎么办
下周要喝酒,有什么健康的酒吗?
我老公喜欢捏我奶每天回家都来他用的力气很大
炝菠菜怎么做
2016验兵牙齿不好要不要
我30岁未婚,我应该娶个未婚女呢,还是娶个二
想看以爱情为主的网游小说,求介绍!
房地产企业预缴的营业税和土地增值税如何做会
56<口4,口里最小填()。
推荐资讯
泗阳最大的服装厂是哪家呀?叫什么名字呀?不
未来之星午托班地址有知道的么?有点事想过去
为什么说隔代教育不能完全取代亲子教育
她写字特别好看,能看出她性格吗,你们觉得她
为何以前都没有人用竹子造纸?
防水姓名贴打印机怎么安装
关于神舟九号的资料 不少于100字
班级心理角布置o(╯□╰)o现在等
发金造型地址好找么,我有些事要过去,
诺亚英语(黔西南兴义市)地址在哪,我要去那里
从先农坛体育场到798艺术区
610办公室的来源
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?