1、b. 在read中malloc只能申请4字节的空间,但fread(,m_nImage,)读入位图大小个。第一步:添加BMP信息文件头文件新建创建ImageStruct.h包含BMP格式的文件头部分的结构。打开ImageStruct.h并添加代码:重点注意:1.bmp结构头必须定义成BITMAPFILEHEADER_ 不能定义成BITMAPFILEHEADER;因为在MFC中已存在BITMAPFILEHEADER的定义,在定义成它会显示重复定义。同时自己定义的在View.h和View.cpp中注意引用#include “ImageStruct.h”。2.在后面的引用bmp结构时我定义成系统自带的
2、结构:BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;而不是BITMAPFILEHEADER_ ,因为MFC中用自带的定义图片头文件信息是正确的,但在位图信息块总会在文件最后多出2字节并默认为CD(0x16进制)。原因可能是自定义的图片头文件少2字节,在后面补充了2字节。(未知)/*/* BMP位图文件包括4部分: */* 位图文件头结构BITMAPFILEHEADER */* 位图信息头结构BITMAPINFOHEADER */* 位图颜色表RGBQUAD */* 位图像素数据 */#ifndef _IMAGESTRUCT_#define _IMAGEST
3、RUCT_/*14byte BMP文件头含有BMP文件的类型、大小、位图文件的保留字、位图数据距文件头的偏移量*/typedef struct T_BITMAPFILEHEADER WORD bfType; /2byte 位图文件的类型,必须为BM 0x424d DWORD bfSize; /4byte 位图文件的大小,以字节为单位 WORD bfReserved1; /2byte 位图文件保留字,必须为0 WORD bfReserved2;DWORD bfOffBits; /4byte 位图数据距文件头的偏移量(字节) BITMAPFILEHEADER_;/*40byte BMP位图信息头用
4、于说明位图的尺寸等信息*/typedef struct T_BITMAPINFOHEADER DWORD biSize; /本结构所占用字节数LONG biWidth; /位图的宽度,以像素为单位LONG biHeight; /位图的高度,以像素为单位WORD biPlanes; /目标设备的级别,必须为1WORD biBitCount; /每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)或24(真彩色)之一DWORD biCompression;/位图压缩类型,必须是 0(不压缩)1(BI_RLE8压缩类型)或2(BI_RLE压缩类型)之一DWORD biSizeImage
5、; /位图的大小,以字节为单位LONG biXPelsPerMeter; /位图水平分辨率,每米像素数LONG biYPelsPerMeter; /位图垂直分辨率,每米像素数DWORD biClrUsed; /位图实际使用的颜色表中的颜色数DWORD biClrImportant; /位图显示过程中重要的颜色数 BITMAPINFOHEADER_;/*BMP位图颜色表*/typedef struct T_RGBQUAD BYTE rgbBlue; /蓝色的亮度(值范围为0255) BYTE rgbGreen; /绿色的亮度(值范围为0255) BYTE rgbRed; /红色的亮度(值范围为0
6、255) BYTE rgbReserved; /保留,必须为0 RGBQUAD_;#endif第二步:在.View.h中添加共有成员变量和成员函数1.找到.View.h头文件添加:#include ImageStruct.h2.在Class CBmpDrawView : public Cview中的public中添加成员变量函数:public:/用来保存bmp格式图片bool SaveBmp(LPCSTR lpFileName);/用来读取bmp图片bool ReadBmp();/用来显示指定位图jpg、gif的函数bool ShowJpgGif(CDC* pDC,CString strPat
7、h, int x, int y);/用来显示指定位图bmp的函数 void ShowBitmap(CDC* pDC,CString BmpName);/*CBitmap m_bitmaplin; 创建临时位图对象进行处理*/CBitmap m_bitmap; /创建位图对象CString EntName; /保存图像文件扩展名CString BmpName; /保存图像文件文件名int m_nWidth; /图像实际宽度int m_nHeight; /图像实际高度int m_nDrawWidth; /图像显示宽度int m_nDrawHeight; /图像显示高度DWORD m_nImage;
8、 /图像数据的字节数 只含位图 DWORD相当于long intDWORD m_nSize; /图像文件大小int m_nLineByte; /图像一行所占字节数int m_nBitCount; /图像每个像素所占位数int m_nPalette;/*注意:信息头必须条用系统bmp的结构BITMAPFILEHEADER 否则会多2字节*/BITMAPFILEHEADER bfh; /全局变量文件头BITMAPINFOHEADER bih; /全局变量信息头RGBQUAD *m_pPal; /颜色表指针BYTE *m_pImage; /读入图片数据后的指针 BYTE相当于 unsigned ch
9、arvirtual CBmpDrawView();第三步:添加readbmp函数添加函数的方法:a.在View.h的public中直接添加函数bool ReadBmp()像第二步中一样;然后在View.cpp中添加函数:bool CBmpDrawView:ReadBmp()。b.选中ClassView区-选中View类右键-增加成员变量函数函数类型为bool函数名为ReadBmp()函数Access为public。程序会自动在View.cpp中添加函数:c.添加代码:/*写入bmp格式图片过程*/ReadBmp() FILE *fp = fopen(BmpName,rb); /读取bmp图片
10、BmpName为图片的绝对路径 if(fp=0) AfxMessageBox(无法打开文件!,MB_OK,0); return 0; /*读取文件头 全局变量bfh BITMAPFILEHEADER 定义在ImageStruct中*/*解决BMP格式倒置的方法 (CSDN) fread(&bfh,sizeof(BITMAPFILEHEADER),1,fp);倒置*/ fread(&bfh.bfType,sizeof(WORD),1,fp);bfh.bfSize,sizeof(DWORD),1,fp);bfh.bfReserved1,sizeof(WORD),1,fp);bfh.bfReserv
11、ed2,sizeof(WORD),1,fp);bfh.bfOffBits,sizeof(DWORD),1,fp); m_nSize = bfh.bfSize; /图像文件的总字节数 /*判断是否是bmp格式图片 BM*/ if(bfh.bfType!=0x4d42) AfxMessageBox(不是BMP格式图片! /*读取信息头*/*解决BMP格式倒置的方法fread(&bih,sizeof(BITMAPINFOHEADER),1,fp);bih.biSize,sizeof(DWORD),1,fp);bih.biWidth,sizeof(LONG),1,fp);bih.biHeight,si
12、zeof(LONG),1,fp);bih.biPlanes,sizeof(WORD),1,fp);bih.biBitCount,sizeof(WORD),1,fp);bih.biCompression,sizeof(DWORD),1,fp);bih.biSizeImage,sizeof(DWORD),1,fp);bih.biXPelsPerMeter,sizeof(LONG),1,fp);bih.biYPelsPerMeter,sizeof(LONG),1,fp);bih.biClrUsed,sizeof(DWORD),1,fp);bih.biClrImportant,sizeof(DWORD
13、),1,fp); if(bih.biSize!=sizeof(bih) AfxMessageBox(本结构所占用字节数出现错误 /*位图压缩类型:必须是0(不压缩)、1(BI_RLE8压缩类型)、2(BI_RLE压缩类型)之一*/ if(bih.biCompression = BI_RLE8 | bih.biCompression = BI_RLE4) AfxMessageBox(位图被压缩! /*获取图像高宽和每个像素所占位数*/ m_nHeight = bih.biHeight; m_nWidth = bih.biWidth; m_nDrawHeight = bih.biHeight; m
14、_nDrawWidth = bih.biWidth; m_nBitCount = bih.biBitCount; /每个像素所占位数 /*计算图像每行像素所占的字节数(必须是4字节的倍数) 2种方法*/ /m_nLineByte = (m_nWidth*m_nBitCount/8+3)/4*4;m_nLineByte = (m_nWidth*m_nBitCount+31)/32*4;/*计算图片位图的大小 长*宽*3为24位bmp位图大小3表示rgb*/ m_nImage = m_nLineByte * m_nHeight; /*位图实际使用的颜色表中的颜色数 biClrUsed 注:24位b
15、mp不用改参数*/ m_nPalette = 0; if(bih.biClrUsed) m_nPalette = bih.biClrUsed; /*申请位图空间 大小为位图大小 m_nImage*/ /*注意:malloc只能申请4字节的空间(未知) 但fread(,m_nImage,)读入位图大小个*/ m_pImage=(BYTE*)malloc(m_nImage); fread(m_pImage,m_nImage,1,fp);要关闭fp*/ fclose(fp); return true;第四步:添加保存menu控件和函数a.查看-建立类导向(Ctrl+W)-CpictureXSView
16、(类名)-ID_FILE_SAVE(IDs列表)-COMMAND(Messages列表)-默认成员函数名为OnFileSave-Member Functions(成员函数)中双击该函数进入函数编辑。b.注意:Ctrl+W把另存为也设置成与保存相同的函数。ID_FILE_SAVE_AS-COMMAN-函数OnFileSaveAs改名为OnFileSave。/*文件保存*/void CBmpDrawView:OnFileSave() / TODO: Add your command handler code hereCString filter; filter=所有文件(*.*)|*.bmp;*.
17、jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff|;/*重点:1-文件打开 0-文件保存*/ CFileDialog dlg(0,NULL,NULL,OFN_HIDEREADONLY,filter,NULL); /产生保存对话框 /*按下确定按钮*/ if( dlg.DoModal() = IDOK ) CString str; CString strName; CString filename; str = dlg.GetPathName(); /获取文件的路
18、径 filename = dlg.GetFileTitle(); /获取文件名 int nFilterIndex=dlg.m_ofn.nFilterIndex; if( nFilterIndex = 2 ) /当用户选择文件过滤器为.BMP时 str = str + .bmp /自动加扩展名.bmp SaveBmp(str); /保存bmp图片 就是一个写出图片的过程 AfxMessageBox(图片保存成功第五步:添加保存函数SaveBmp添加函数原理同第三步添加Readbmp函数,在添加下列代码:/*保存bmp格式图片 写出图片的过程 只处理24像素的图片 该图片无调色板*/SaveBmp
19、(LPCTSTR lpFileName) /*lpFileName为位图文件路径名*/ /AfxMessageBox(lpFileName); FILE *fpo = fopen(BmpName, FILE *fpw = fopen(lpFileName,wbbfh,sizeof(BITMAPFILEHEADER),1,fpo);bih,sizeof(BITMAPINFOHEADER),1,fpo); fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);bih,sizeof(BITMAPINFOHEADER),1,fpw); /*malloc只能申请4字节的
20、空间 (未知)*/ fread(m_pImage,m_nImage,1,fpo); fwrite(m_pImage,m_nImage,1,fpw); fclose(fpo); fclose(fpw);第六步:在word1中的修改a. 在void CPictureMapView:ShowBitmap(CDC* pDC,CString BmpName)中实现图片可以压缩伸展显示的功能:/*/*图片显示调用函数BitBlt变成StretchBlt */ /pDC-BitBlt(0,0,m_bmp.bmWidth,m_bmp.bmHeight,&dcBmp,0,0,SRCCOPY);if(m_nDra
21、wWidth650 & m_nDrawHeightStretchBlt(0,0,m_nDrawWidth,m_nDrawHeight,&dcBmp,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SRCCOPY); /显示原图elseStretchBlt(0,0,640,640,&/显示大小横为640*640b. 在void CPictureMapView:OnDraw(CDC* pDC)函数中添加ReadBmp读取图片:if( EntName.Compare(_T(bmp) = 0 ) /bmp格式 ReadBmp(); /图片信息保存如全局变量 ShowBitmap(pDC,BmpName); /显示图片
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1