vc6.0读取位图、显示位图与保存位图之全攻略_第1页
vc6.0读取位图、显示位图与保存位图之全攻略_第2页
vc6.0读取位图、显示位图与保存位图之全攻略_第3页
vc6.0读取位图、显示位图与保存位图之全攻略_第4页
vc6.0读取位图、显示位图与保存位图之全攻略_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作者:彭军一、了解位图的文件结构我这里要说的主要是如何读入 8位或 24位位图。因为这两种格式的位图更加具有代表性。如 32位位图也只是多了一个透明度的分量罢了。其跟 24位位图的格式相比变化不大。我们常说进行数字图像处理,其实主要是处理位图的像素数据和采用何种算法去处理像素数据。可是,要想处理像素数据,首先就是要读入位图的数据。不然,处理从何谈起。下面我将详细的说明 BMP位图的文件结构,相信看完之后,对于读入位图就不是什么难事了。当然,我这里的前提是你熟悉如何读入文件。好了,废话不多说了。我们开始吧。BMP位图的第一部分就是文件头。下面是它的结构:typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER, *PBITMAPFILEHEADER;上面的这个文件头的结构体是摘自 MSDN。它的各项的含义如下:bfType 代表的是文件格式,就是“BM”,用十六进制的数表示是 0x4d42,用十进制的数表示就是 19778。所以,从 BMP文件的前两个字节我们就可以判断我们要打开的图片是不是位图,如果不是的话,我们就可以不用读了。bfSize 代表的是该位图文件的大小(包含文件头、信息头、调色板(如果有)、像素数据)。它是一个 DWORD类型,占 4个字节。bfReserved1 和 bfReserved2都是保留量,因此它们应该都为 0。它们合起来占 4个字节。bfOffBits 代表的是像素数据距离文件头的位置,也就是偏移地址。如果我们想直接读像素数据的话,可以把文件指针偏移 bfOffBits个字节,然后读取就可以了,知道读到文件结尾。这样算起来,文件头一共占了 2+4+2+2+4=14字节。所以,这个文件头的大小固定是 14字节的。而且,还有重要的一点是,其实在保存 BMP文件的时候,保存的顺序也是按照bfType、bfSize、bfReserved1、bfReserved2、bfOffBits 的顺序的。因此,如果我们不想用微软的这个结构体的话,你可以按照上面的顺序依次的读入各项,用不用这个结构体,关系不是很大。不过只是说,用结构体的话,可能会带来一些方便罢了。这一点,在当你用 C或 Java来读取的时候,会感觉更深刻。因为在 C或 Java中没有微软提供的这个结构体,要么自己构造这个结构体,要么你就按找顺序和字节数依次读出各项的值。后面有我的 C和 Java读入位图的例子,你可以参看下。BMP位图的第二部分就是信息头。下面是它的结构:typedef struct tagBITMAPINFOHEADERDWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER, *PBITMAPINFOHEADER;当然了,这个结构体还是来自 MSDN的。biSize 代表的是该结构体的大小,即 40字节。biWidth 代表的是位图的宽度,以像素为单位。biHeight 代表的是位图的高度,以像素为单位。biPlanes 代表的位图的平面数,平面数不同,RGB 各分量所排列的顺序不一样。一般常见的是 1,也就是 RGB各分量是按照 BGR的顺序在像素数据中排列的。biBitCount代表的是位图的位数,有 1、16、8、24、32 等。biCompression 代表是位图的压缩方法,由于 BMP位图是没有压缩的,所以通常情况下它的值都为 0。biSizeImage 代表的是位图像素数据的大小,就是高度乘上每行像素所占的字节数。biXPelsPerMeter 代表的是水平方向的分辨率,以米为单位。这个参数没有什么太大的意义,至少现在我还没发现。所以,它通常情况下都为 0,不是 0也没有关系。biYPelsPerMeter 代表的是垂直方向的分辨率,以米为单位,通常为 0。biClrUsed 代表的是位图用到的颜色数,可以设置为0,代表的是全部用到了。biClrImportant 代表的是位图中重要的颜色数,可以设置为 0,代表的是全部都很重要。LONG 和 DWORD都占 4个字节,WORD 占 2个字节,因此,该结构体(也就是信息头)共占 40字节。还要说明的一点是,在保存位图的时候,我们也可以按照上面的结构体中各项的顺序来保存位图。在读入位图的时候,也可以按字节和上面的顺序来依次读入各项。用不用结构体,关系不大。还是那句话,当你用 C或 Java读入信息头的时候,就会理解这个顺序的重要性了。typedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; RGBQUAD同样,上面的这个结构体仍然来自 MSDN。首先要说明的一点是,只有 8 位位图具有调色板。而调色板是有若干项(最多 256 项)构成的,而每一项都是一个 RGBQUAD 的结构体,也就是说每一项都有一个蓝色、绿色、红色和保留量。而在 8 位位图中,如果我们读到的 biClrUsed 不为 0,代表没有全部用上 256 中颜色的话,那代表像素数据的偏移地址就不是 1078(14+40+256*4=1078 ) 。这样其实也完全没有影响,我们在读入和保存位图的时候,对于 8 位位图来说,完全没有必要去读入调色板。因为我们完全可以自己去构造一个调色板,如下面的程序:RGBQUAD *pal=new RGBQUAD256;for(int i=0;i 1000#pragma once#endif / _MSC_VER 1000/ CReadImageDlg dialogclass CReadImageDlg : public CDialog/ Constructionpublic:BYTE* m_pPixel;BYTE* m_pBmInfo;BITMAPFILEHEADER* m_pBmfh;CReadImageDlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data/AFX_DATA(CReadImageDlg)enum IDD = IDD_READIMAGE_DIALOG ;/ NOTE: the ClassWizard will add data members here/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CReadImageDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CReadImageDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_READIMAGEDLG_H_FD65CF60_4E3C_4111_B736_CD4B51F1CE63_INCLUDED_)CReadImageDlg的构造函数中添加一句程序:m_pBmfh=new BITMAPFILEHEADER;添加完成后,其构造函数为:CReadImageDlg:CReadImageDlg(CWnd* pParent /*=NULL*/): CDialog(CReadImageDlg:IDD, pParent)/AFX_DATA_INIT(CReadImageDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);/为位图文件头指针分配一个空间m_pBmfh=new BITMAPFILEHEADER;然后为 Read按钮添加单击的响应函数,在下面写入如下程序:void CReadImageDlg:OnBtnRead() / TODO: Add your control notification handler code here/用打开对话框获得要打开位图的路径CFileDialog dlg(true,“*.bmp“,NULL,OFN_OVERWRITEPROMPT| OFN_HIDEREADONLY,“BMP files(*.bmp)|*.bmp|“);if(dlg.DoModal()!=IDOK)return;/新建一个 CFile类的对象 dib,并以读的模式打开CFile dib(dlg.GetPathName(),CFile:modeRead);/读入位图文件头dib.Read(m_pBmfh,sizeof(BITMAPFILEHEADER);/为位图信息(信息头+调色板(如果有的话)分配空间m_pBmInfo=new BYTEm_pBmfh-bfOffBits-14;/读入位图信息,其大小为像素数据的偏移地址-位图文件头大小dib.Read(m_pBmInfo,m_pBmfh-bfOffBits-14);/下面的程序的目的是计算像素矩阵的大小,就是为了得到 height和 LineBytes/新建一个位图信息头变量BITMAPINFOHEADER bmih;/拷贝一个信息头大小的字节到该变量中memcpy(/从信息头中获取位图的信息long width=bmih.biWidth;/获取宽度int bitCount=bmih.biBitCount;/获取位数long height=bmih.biHeight;/获取高度long LineBytes=(width*bitCount+31)/32*4;/计算每行像素所占的字节数/为像素矩阵分配空间m_pPixel=new BYTEheight*LineBytes;/读入位图的像素矩阵dib.Read(m_pPixel,height*LineBytes);/关闭文件dib.Close();为 Show按钮添加一个响应函数,其代码如下:void CReadImageDlg:OnBtnShow() / TODO: Add your control notification handler code hereBITMAPINFOHEADER bmih;memcpy(long width=bmih.biWidth;long height=bmih.biHeight;StretchDIBits(GetDC()-m_hDC,0,0,width,height,0,0,width,height,m_pPixel,(BITMAPINFO*)m_pBmInfo,DIB_RGB_COLORS,SRCCOPY);为 Save按钮添加一个响应函数,其代码如下:void CReadImageDlg:OnBtnSave() / TODO: Add your control notification handler code here/用保存对话框获取保存路径CFileDialog dlg(false,“*.bmp“,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,“BMP files(*.bmp)|*.bmp|“);if(dlg.DoModal()!=IDOK)return;/以写二进制数据的方式,打开文件CFile dib(dlg.GetPathName(),CFile:modeCreate | CFile:modeWrite | CFile:typeBinary);/写入已经读入的文件头dib.Write(m_pBmfh,sizeof(BITMAPFILEHEADER);/写入已经读入的位图信息(信息头+调色板(如果有的话)dib.Wri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论