




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。VC6.0读取位图、显示位图与保存位图之全攻略-作者:彭军一、了解位图的文件结构我这里要说的主要是如何读入8位或24位位图。因为这两种格式的位图更加具有代表性。如32位位图也只是多了一个透明度的分量罢了。其跟24位位图的格式相比变化不大。我们常说进行数字图像处理,其实主要是处理位图的像素数据和采用何种算法去处理像素数据。可是,要想处理像素数据,首先就是要读入位图的数据。不然,处理从何谈起。下面我将详细的说明BMP位图的文件结构,相信看完之后,对于读入位图就不是什么难事了。当然,我这里的前提是你熟悉如何读
2、入文件。好了,废话不多说了。我们开始吧。BMP位图的第一部分就是文件头。下面是它的结构:typedefstructtagBITMAPFILEHEADERWORDbfType;DWORDbfSize;WORDbfReserved1;WORDbfReserved2;DWORDbfOffBits;BITMAPFILEHEADER,*PBITMAPFILEHEADER;上面的这个文件头的结构体是摘自MSDN。它的各项的含义如下:bfType代表的是文件格式,就是“BM”,用十六进制的数表示是0 x4d42,用十进制的数表示就是19778。所以,从BMP文件的前两个字节我们就可以判断我们要打开的图片是不
3、是位图,如果不是的话,我们就可以不用读了。bfSize代表的是该位图文件的大小(包含文件头、信息头、调色板(如果有)、像素数据)。它是一个DWORD类型,占4个字节。bfReserved1和bfReserved2都是保留量,因此它们应该都为0。它们合起来占4个字节。bfOffBits代表的是像素数据距离文件头的位置,也就是偏移地址。如果我们想直接读像素数据的话,可以把文件指针偏移bfOffBits个字节,然后读取就可以了,知道读到文件结尾。这样算起来,文件头一共占了2+4+2+2+4=14字节。所以,这个文件头的大小固定是14字节的。而且,还有重要的一点是,其实在保存BMP文件的时候,保存的顺
4、序也是按照bfType、bfSize、bfReserved1、bfReserved2、bfOffBits的顺序的。因此,如果我们不想用微软的这个结构体的话,你可以按照上面的顺序依次的读入各项,用不用这个结构体,关系不是很大。不过只是说,用结构体的话,可能会带来一些方便罢了。这一点,在当你用C或Java来读取的时候,会感觉更深刻。因为在C或Java中没有微软提供的这个结构体,要么自己构造这个结构体,要么你就按找顺序和字节数依次读出各项的值。后面有我的C和Java读入位图的例子,你可以参看下。BMP位图的第二部分就是信息头。下面是它的结构:typedefstructtagBITMAPINFOHEA
5、DERDWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbiPlanes;WORDbiBitCount;DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;BITMAPINFOHEADER,*PBITMAPINFOHEADER;当然了,这个结构体还是来自MSDN的。biSize代表的是该结构体的大小,即40字节。biWidth代表的是位图的宽度,以像素为单位。biHeight代表的是位图的高度,
6、以像素为单位。biPlanes代表的位图的平面数,平面数不同,RGB各分量所排列的顺序不一样。一般常见的是1,也就是RGB各分量是按照BGR的顺序在像素数据中排列的。biBitCount代表的是位图的位数,有1、16、8、24、32等。biCompression代表是位图的压缩方法,由于BMP位图是没有压缩的,所以通常情况下它的值都为0。biSizeImage代表的是位图像素数据的大小,就是高度乘上每行像素所占的字节数。biXPelsPerMeter代表的是水平方向的分辨率,以米为单位。这个参数没有什么太大的意义,至少现在我还没发现。所以,它通常情况下都为0,不是0也没有关系。biYPelsP
7、erMeter代表的是垂直方向的分辨率,以米为单位,通常为0。biClrUsed代表的是位图用到的颜色数,可以设置为0,代表的是全部用到了。biClrImportant代表的是位图中重要的颜色数,可以设置为0,代表的是全部都很重要。LONG和DWORD都占4个字节,WORD占2个字节,因此,该结构体(也就是信息头)共占40字节。还要说明的一点是,在保存位图的时候,我们也可以按照上面的结构体中各项的顺序来保存位图。在读入位图的时候,也可以按字节和上面的顺序来依次读入各项。用不用结构体,关系不大。还是那句话,当你用C或Java读入信息头的时候,就会理解这个顺序的重要性了。typedefstruct
8、tagRGBQUADBYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;RGBQUAD同样,上面的这个结构体仍然来自MSDN。首先要说明的一点是,只有8位位图具有调色板。而调色板是有若干项(最多256项)构成的,而每一项都是一个RGBQUAD的结构体,也就是说每一项都有一个蓝色、绿色、红色和保留量。而在8位位图中,如果我们读到的biClrUsed不为0,代表没有全部用上256中颜色的话,那代表像素数据的偏移地址就不是1078(14+40+256*4=1078)。这样其实也完全没有影响,我们在读入和保存位图的时候,对于8位位图来说,完全没有必要
9、去读入调色板。因为我们完全可以自己去构造一个调色板,如下面的程序:RGBQUAD*pal=newRGBQUAD256;for(inti=0;i1000#pragmaonce#endif/_MSC_VER1000/CReadImageDlgdialogclassCReadImageDlg:publicCDialog/Constructionpublic:BYTE*m_pPixel;BYTE*m_pBmInfo;BITMAPFILEHEADER*m_pBmfh;CReadImageDlg(CWnd*pParent=NULL);/standardconstructor/DialogData/AFX_
10、DATA(CReadImageDlg)enumIDD=IDD_READIMAGE_DIALOG;/NOTE:theClassWizardwilladddatamembershere/AFX_DATA/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CReadImageDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX);/DDX/DDVsupport/AFX_VIRTUAL/Implementationprotected:HICONm_hIcon;/Generate
11、dmessagemapfunctions/AFX_MSG(CReadImageDlg)virtualBOOLOnInitDialog();afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);afx_msgvoidOnPaint();afx_msgHCURSOROnQueryDragIcon();/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/MicrosoftVisualC+willinsertadditionaldeclarationsimmediatelybeforethepreviousline
12、.#endif/!defined(AFX_READIMAGEDLG_H_FD65CF60_4E3C_4111_B736_CD4B51F1CE63_INCLUDED_)CReadImageDlg的构造函数中添加一句程序:m_pBmfh=newBITMAPFILEHEADER;添加完成后,其构造函数为:CReadImageDlg:CReadImageDlg(CWnd*pParent/*=NULL*/):CDialog(CReadImageDlg:IDD,pParent)/AFX_DATA_INIT(CReadImageDlg)/NOTE:theClassWizardwilladdmemberini
13、tializationhere/AFX_DATA_INIT/NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32m_hIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);/为位图文件头指针分配一个空间m_pBmfh=newBITMAPFILEHEADER;然后为Read按钮添加单击的响应函数,在下面写入如下程序:voidCReadImageDlg:OnBtnRead()/TODO:Addyourcontrolnotificationhandlercodehere/用打开对话框获得要打开位图的路径CF
14、ileDialogdlg(true,*.bmp,NULL,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,BMPfiles(*.bmp)|*.bmp|);if(dlg.DoModal()!=IDOK)return;/新建一个CFile类的对象dib,并以读的模式打开CFiledib(dlg.GetPathName(),CFile:modeRead);/读入位图文件头dib.Read(m_pBmfh,sizeof(BITMAPFILEHEADER);/为位图信息(信息头+调色板(如果有的话)分配空间m_pBmInfo=newBYTEm_pBmfh-bfOffBits-1
15、4;/读入位图信息,其大小为像素数据的偏移地址-位图文件头大小dib.Read(m_pBmInfo,m_pBmfh-bfOffBits-14);/下面的程序的目的是计算像素矩阵的大小,就是为了得到height和LineBytes/新建一个位图信息头变量BITMAPINFOHEADERbmih;/拷贝一个信息头大小的字节到该变量中memcpy(&bmih,m_pBmInfo,sizeof(BITMAPINFOHEADER);/从信息头中获取位图的信息longwidth=bmih.biWidth;/获取宽度intbitCount=bmih.biBitCount;/获取位数longheight=bm
16、ih.biHeight;/获取高度longLineBytes=(width*bitCount+31)/32*4;/计算每行像素所占的字节数/为像素矩阵分配空间m_pPixel=newBYTEheight*LineBytes;/读入位图的像素矩阵dib.Read(m_pPixel,height*LineBytes);/关闭文件dib.Close();为Show按钮添加一个响应函数,其代码如下:voidCReadImageDlg:OnBtnShow()/TODO:AddyourcontrolnotificationhandlercodehereBITMAPINFOHEADERbmih;memcpy
17、(&bmih,m_pBmInfo,sizeof(BITMAPINFOHEADER);longwidth=bmih.biWidth;longheight=bmih.biHeight;StretchDIBits(GetDC()-m_hDC,0,0,width,height,0,0,width,height,m_pPixel,(BITMAPINFO*)m_pBmInfo,DIB_RGB_COLORS,SRCCOPY);为Save按钮添加一个响应函数,其代码如下:voidCReadImageDlg:OnBtnSave()/TODO:Addyourcontrolnotificationhandlerco
18、dehere/用保存对话框获取保存路径CFileDialogdlg(false,*.bmp,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,BMPfiles(*.bmp)|*.bmp|);if(dlg.DoModal()!=IDOK)return;/以写二进制数据的方式,打开文件CFiledib(dlg.GetPathName(),CFile:modeCreate|CFile:modeWrite|CFile:typeBinary);/写入已经读入的文件头dib.Write(m_pBmfh,sizeof(BITMAPFILEHEADER);/写入已经读入的位图信息(信息头+调色板(如果有的话)dib.Write(m_pBmInfo,m_pBmfh-bfOffBits-14);/下面的程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商务用酒合同协议
- 正规地摊经济合同协议
- 含税销售合同协议
- 商标代理公司合同协议
- 商业秘密协议英文合同
- 商场店面转兑合同协议
- 商场和餐饮商家合同协议
- 德国租车位合同协议
- 商业产品买卖合同协议
- 售楼处购房合同定金协议
- 华为企业采购流程
- 大部分分校:地域文化形考任务四-国开(CQ)-国开期末复习资料
- CQI-23模塑系统评估审核表-中英文
- 会计记账服务合同
- 2024年共青团入团积极分子考试题库(附答案)
- MOOC 职场英语-西南交通大学 中国大学慕课答案
- 2069-3-3101-002WKB产品判定准则-外发
- 快捷酒店安全现状评价报告安全现状评价
- fx-991cnx计算器说明书
- 外地特种人员入渝登记申请表
- 升压站场区绿化专项施工方案
评论
0/150
提交评论