ImageVerifierCode 换一换
格式:DOCX , 页数:38 ,大小:1.53MB ,
资源ID:9974545      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9974545.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(位图的基本格式.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

位图的基本格式.docx

1、位图的基本格式第一章 位图的基本格式 1 1位图文件格式的产生及发展BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行图像文件格式。它的主要特点可以概括为:文件结构与PCX文件格式类似,每个文件只能存放一幅图像;图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理成为图像文件的一个选项,用户可以根据需要进行选择。其中,非压缩格式是BMP图像文件所采用的一种通用格式。但是,如果用户确定将BMP文件格式压

2、缩处理,则Windows设计了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式,则采用RLE8压缩方式。同时,BMP图像文件格式可以存储单色、16色、256色以及真彩色四种图像数据,其数据的排列顺序与一般文件不同,它以图像的左下角为起点存储图像,而不是以图像的左上角为起点;而且BMP图像文件格式中还存在另外一个与众不同的特点,即其调色板数据所采用的数据结构中,红、绿、蓝三种基色数据的排列顺序也恰好与其它图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境的新特色,而且随着Windows版本的不断更新,微软公司也在不断改进其BMP图像文件格式

3、,例如:当前BMP图像文件版本中允许采用32位颜色表,而且针对32位Windows 的产生,相应的API函数也在不断地推陈出新,这些无疑都同时促成了BMP文件格式的不断风靡。但由于BMP文件格式只适合于Windows上的应用软件,而对于DOS环境中的各种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文件格式的流通程度超过PCX文件格式的一个重要因素。1 2 位图文件的类型Windows中定义了两种位图文件类型,即一般位图文件格式与设备无关位图文件格式。其中,由于设备无关位图(DIB)文件格式具有更强的灵活性与完整的图像数据、 压缩方式等定义。BMP图像文件的结构可以分为如下三个部分:

4、文件头、调色板数据以及图像数据。其中文件头的长度为固定值54个字节;调色板数据对所有不超过256色的图像模式都需要进行设置,即使是单色图像模式也不例外,但是对于真彩色图像模式, 其对应的BMP文件结构中却不存在相应调色板数据的设置信息;图像数据既可以采用一定的压缩算法进行处理,也可以不必对图像数据进行压缩处理,这不仅与图像文件的大小相关,而且也与对应的图像处理软件是否支持经过压缩处理的BMP图像文件相关。以下将分别介绍BMP图像文件结构中的这三个重要组成部分。特别值得注意的是:BMP 图像文件结构设计得相当简单,这无疑有利于图像文件的处理速度,但是同时也使得 BMP图像文件格式具有一定的局限性

5、,即一个BMP图像文件只能存储一幅图像。13 BMP文件格式的结构定义BMP图像文件的文件头定义Windows中将BMP图像文件的文件头分成两个数据结构,其中一个数据结构中包含BMP文件的类型、大小和打印格式等信息,称为BITMAPFILEHEADER;另外一个数据结构中则包含BMP文件的尺寸定义等信息,称为 BITMAPINFOHEADER。如果图像文件还需要调色板数据,则将其存放在文件头信息之后。BITMAPFIEHEADER数据结构在Windowsh中的定义为:typedef structure tagBITMAPFILEHEADERWORD bfType;DWORD bfSize:WO

6、RD bfReserved1;WORD bfReserved2:DWORD bfOffBits: BITMAPFILEHEADER;其中,bfType在图像文件存储空间中的数据地址为0,数据类型unsigned char,内容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。bfSize的数据地址为2,类型unsigned long,它以字节为单位,定义位图文件的大小。BfReserved1与bfReserved2的数据地址分别为6和8,数据类型则都为unsigned int,二者都是BMP文件的保留字,没有任何意义,其值必须为0.bfOffBits的数据地址为10,数据类型为u

7、nsigned long,它以字节为单位,指示图像数据在文件内的起始地址,即图像数据针对文件头的偏移量。BITMAPINFOHEADER数据结构用于说明位图的大小,其定义为:type structure tagBITMAPINFOHEADER DWORD biSize:DWORD biWidth;DWORD biHeight; WORD biPlanes: WORD biBitCount:DWORD biCompression;DWORD biSizelmage; DWORD biXPelsPerMeter:DWORD biYPelsPerMeter:DWORD biClrUsed;DWORD

8、 biClrlmportant;BITMAPINFOHEADER;其中,biSize的数据地址为14,数据类型为unsigned long,它以字节为单位指定数据 结构BITMAPINFOHEADER所占用的存储容量,固定值为40。biWidth与biHeight的数据地址分别为18和22,数据类型都是unsigned long,它们分别以像素为单位,给出该BMP文件所描述位图的宽度与高度。若biHeight的取值为正数, 则表明位图为bottomup类型的DIB位图,而且位图原点为左下角。若biHeight的取值为负数,则表明位图为topdown类型的DIB位图而且位图原点为左上角。 注意:

9、一般位图定义中,这两个字段的取值必须为正数。biPlanes的数据地址为26,类型为unsigned int,它代表目标设备的平面数必须为1。biBitCount的数据地址为28,类型为unsigned int,它确定每个像素所需要的位数。当图像为单色时,该字段的取值为1;当图像为16色时,该字段的取值为4;当图像为256 色时,该字段的取值为8;当图像为真彩色时,该字段的取值为24。biCompression的数据地址为30,类型为unsigned long,它代表bottomup类型位图的压缩类型(注意:topdown类型位图不能进行压缩处理),其可能取值及其含义分别为:若该字段的取值为B

10、IRGB,则表示文件内的图像数据没有经过压缩处理;若该字段的取值为BIRLE8,则表示所压缩的图像数据是256色,采用的压缩方法是RLE8;若该字段的取值为BIRLE4,则表示所压缩的图像数据是16色,采用的压缩方法是RLE4;若该字段的取值为BIBITFIELDS,则表明图像文件内的数据没有经过压缩处理,而且颜色表由分别表示每个像素点的红、绿、蓝三原色的双字组成。 注意:BMP文件格式在处理单色或者真彩色图像时,不论图像数据多么庞大,都不对图像数据进行任何压缩处理。biSizelmage的数据地址为34,类型为unsigned long,它以字节为单位,给出该BMP内图像数据占用的空间大小。

11、若图像文件描述BIRGB位图,则该字段的值必须设置为0。biXPelsPerMeter字段与biYPelsPerMeter字段的数据地址分别为38与42,类型都是 unsigned long,它们分别以每米像素数为单位,给出位图目的设备水平以及垂直方向的分辨率;其中,应用程序可以根据biXPelsPerMeter字段的值,从源位图组中选择与当前设备特点最匹配的位图。biClrUsed的数据地址为46,类型为unsigned long,给出位图实际使用的颜色表中的颜色变址数。如果该字段的取值为0,则代表本位图使用了biBitCount字段值所代表的最大颜色值,其中biBitCount字段的取值与

12、biCompression所指定的压缩方法相关。例如:如果图像为16色,而该字段的取值为10,则代表本位图共使用了12种颜色;如果该字段的取值非零,而且biBitCount字段的取值小于16,则该字段指定图像或者设备驱动器存取的实际颜色数。若biBitCount字段的取值大于或者等于16,则该字段指定使Windows系统调色板达到最优性能的颜色表大小。biClrlmportant的数据地址为50,数据类型为unsigned long,它给出位图显示过程中重要颜色的变址数。若该字段的取值为0,则表示所有使用的颜色都是重要颜色。如果位图的描述还需要调色板数据,则应该在BMP文件头之后定义一个颜色表

13、,它包含若干个表项。其中,每一个表项定义了一种颜色,Windows将其定义为如下的 RGBQUAD结构:typedef tagRGBQUADBYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed; BYTE rgbReserved;RGBQUAD;注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何意义,必须取固定值00同时,RGBQUAD结构定义的颜色值中,红色、绿色与蓝色的排列顺序与一般图像文件的颜色数据排列顺序恰好相反,即:蓝色的亮度由rgbBlue字段 定义;绿色的亮度由rgbGreen字段定义;红色的亮度由rgbRed字段定义。

14、若位图中某个像素点的颜色描述为“00,00,FF,00”,则表示该点的颜色为纯红色,而不是纯蓝色。综上,在DIB位图文件组成中,紧随BITMAPFILEHEADER结构其后的数据结构为 BITMAPINFO,两者共同构成完整的位图文件。Windows将BITMAPINFO结构定义为:typedef structure tagBITMAPINFOBITMAPINFOHEADER bmiHeader:RGBQUAD bmiColor1;BITMAPINFO;其中,bmiHeader字段指向包含位图颜色格式以及大小定义的BITMAPHEADERINFO结构。bmiCo1or1字段指向RGBQUAD结

15、构数组或者定义位图颜色值的双字数据结构,它定义了BMP图像文件的颜色表,它包含多少个表项是由 BITMAPINFOHEADER数据结构中的biBitCount字段定义的:若该字段的取值为1,则颜色表中共包含两个表项;若该字段的取值为4,则颜色表中共包含16个表项;若该字段的取值为8,则颜色表中共包含256个表项;若该字段的取值为16,而且 BITMAPINFOHEADER结构定义中指定bmiColors字段的取值为BI_RGB,则颜色表中的表项为空,位图阵列中每个字代表一个像素,字中每5位上的值代表该像素点一种基色的亮度,其中最低5位代表蓝色亮度,依次为绿色与红色,字的最高位没有任何意义。 若

16、该字段的取值为24,则颜色表中的表项为空,而位图阵列的每三个字节代表一个像素,这3个字节直接定义了像素颜色中蓝、绿、红三种基色的相对亮度。若该字段的取值为32,而且BITMAPINFOHEADER结构定义中bmiColors字段的取值为BIRGB,则颜色表中的表项为空,且位图阵列中的每个双字代表一个像素的三原色亮度构成。注意:颜色表中的数据应该按照重要性的帧序进行排列。另外,如果应用程序中需要使用DIB位图,则bmiColors字段可以为16位的无符号整数数组,这些整数指定当前逻辑调色板的颜色索引,而不是显式的RGB值。当然,如果位图存储在文件中或者需要传送到其它应用程序,则该字段中不能包含调

17、色板索引值。 第二章 图像处理技术介绍现做一个简单的系统对图像处理的各种方法做一介绍。下面具体介绍系统的实现与功能。21 界面介绍在普遍使用图形用户界面的今天,使界面和应用程序的内容有机地结合在一起,遵守人性化准则,已经成为应用程序开发的一个重要方面。由于Windows应用程序都是在窗体中运行的,所以界面设计主要就是窗体设计。用户界面设计是一种艺术,同时又有科学的原则和行为准则可以遵循。GUI操作系统的经销商花费了数以万计的小时只是用来测试和改善他们的GUI界面,其中记载了大量的用户的感觉和喜好,改正了界面中不合理的部分和障碍因素努力设计最友好的界面。系统美观是GUI设计中重要的一部分,但GU

18、I设计更重要的是关于实用性、功能和易用性的方面问题。一个好的GUI界面有十条原则可以遵循:1充分发挥GUI界面设计的强大功能2使用形象化的设计3使系统不必要的交互最小化4允许以多种方法访问界面5界面由用户完全控制6在任何时候都协助用户7使用户信任界面8限制用户的选择9提供快速响应10符合工业标准本系统采用VC+的应用向导功能,设计了一个单文档窗口界面。考虑到位图大小的变化,所以界面上设计了滚动条。当位图超过窗口原始尺寸时,自动出现滚动条并可通过拖拉滚动条看到全部位图。界面如图(1)所示。 图(1)22 位图的读入进行图像处理的第一步就是读入位图。由于本系统对于同一幅图像要处理多次,所以在读入位

19、图后要存储位图的数据,使输入一幅位图可以进行多次处理。依据位图文件的结构特点及VC+语言的功能,分以下几步读入位图:221 定义变量 依据位图结构类型,定义以下几个变量 BYTE* m_pDIBData; BITMAPINFO* m_pBMPInfo; BITMAPFILEHEADER bfh;222 读入位图先用下面的语句1)打开一个对话框选择位图文件名,然后用语句2)将变量名保存在FileName变量中。由于FileName是CString 类型,所以在语句3)中打开文件时用GetBuffer()函数取内存中的值。接着语句4)中用Read() 函数读入位图头文件中的数据。1)CfileDi

20、alog FileDia ( TRUE , bmp , NULL , OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , BMP文件 (*.bmp) | * . bmp | 所有文件 (* . *) | * . * | ) ; 2)FileName=FileDia.GetPathName();3)rval=file.Open(FileName.GetBuffer(0), CFile:modeRead | CFile:typeBinary,NULL);4)file.Read(&bfh,sizeof(bfh);223 读入位图的数据在这里定义了一个函数OpenBMPF

21、ile() 读入位图的数据。函数的执行语句如下:先定义位图数据结构的变量并初始化,然后用 Read() 函数读入BITMAPFILEHEADER和BITMAPINFOHEADER结构的数据。接着依照BITMAPINFOHEADER结构类型的biBitCount值将位图分类,24bits位图格式和别的位图格式分别处理。将位图的调色板数据和图像数据皆读入内存。224 显示滚动条读入位图数据后,将位图的大小和窗口的大小进行比较,以决定是否显示滚动条。语句如下 size.cx=m_pBMPInfo-bmiHeader.biWidth; size.cy=m_pBMPInfo-bmiHeader.biHe

22、ight; GetClientRect(&rect); if(rect.left-rect.right)size.cx| (rect.bottom-rect.top)SetScrollSizes(MM_TEXT,size,sizeDefault,sizeDefault); 225 显示位图最后调用Invalidate()函数响应OnDraw()函数在屏幕上绘图。OnDraw()函数的实现方法如下:一通过语句段(1)设置当前文档二语句段(2)读入了当前位图的尺寸和位数三语句段(3)调用StretchDIBits() 函数在屏幕上绘图(1)CBmpDoc* pDoc = GetDocument()

23、; ASSERT_VALID(pDoc);(2)long bmp_Width=m_pBMPInfo-bmiHeader.biWidth; long bmp_Height=m_pBMPInfo-bmiHeader.biHeight; USHORT bmp_bits=m_pBMPInfo-bmiHeader.biBitCount;(3)pDC-SetStretchBltMode(COLORONCOLOR); StretchDIBits(pDC-GetSafeHdc(), 0,0,bmp_Width,bmp_Height, 0,0,bmp_Width,bmp_Height, m_pDIBData,m

24、_pBMPInfo, DIB_RGB_COLORS,SRCCOPY);23 图像处理前的准备在进行图像处理之前,先定义几个有用的函数1) void GetColor_Index_Origin(CPoint*pPoint , COLORREF* pColor);2) void GetColor_TrueColor_Origin(CPoint*pPoint , COLORREF* pColor);3) BOOL SetColor_Index(CPoint* pPoint , COLORREF Color); 4) BOOL SetColor_TrueColor(CPoint*pPoint , CO

25、LORREF Color); 函数1)和2)用于取得屏幕上每个象素的颜色值。在函数1)和2)中,通过下面的语句块规定只能取得位图内的象素值,而位图范围外的区域都设置为白色。读入象素值时,依位图格式的不同读取方法也有变化。24Bits位图像素值只能通过GetColor_TrueColor_Origin()函数来读取,而其它格式的象素值则通过GetColor_Index_Origin()函数来读取。在GetColor_Index_Origin()函数内部又对8Bits,4Bits,1Bits三种不同的位图格式进行分别处理。if (pPoint-x=bmp_Width|pPoint-y=bmp_He

26、ight) *pColor=0; return; 函数3)和4)则用来在屏幕上绘制已知象素值的点。这两个函数同样对不同的象素格式进行不同的处理。这种情况与前面所述的情形相同。24 灰度处理所谓灰度处理是根据输入图像象素的灰度对输出图像象素的灰度进行再定义。这种再定义方法有很多种,可以根据不同的需要定义不同的方法。本例中的方法是先求出图像上点的象素的灰度值,然后将三种原色红、绿、蓝都赋值为此值,再将红、绿、蓝合成象素点绘制到屏幕上。具体实现流程和算法如下:(1)先判断m_pBMPInfo(包含BMP图像数据的变量)中是否包含数据,因为图像处理都是处理m_pBMPInfo中的数据。语句如下: if

27、(m_pBMPInfo=NULL) return;(2)通过BeginWaitCursor() 函数等待响应。(3)通过以下语句段取得位图的长宽尺寸和格式 int dwWidth=m_pBMPInfo-bmiHeader.biWidth; int dwHeight=m_pBMPInfo-bmiHeader.biHeight; UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;(4)对24Bits位图格式和其它格式的位图图像进行不同的处理。对24Bits图像使用以下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。 (a) GetColor_

28、TrueColor_Origin(&point,&Color)(b) SetColor_TrueColor(&point,Color)对其它格式使用以下函数进行处理GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。(5)首先读取位图数据的点的象素值,进行灰度变换以后再以变换以后的象素值输出到原坐标点。24Bits格式位图的灰度变换程序示例如下:1GetColor_TrueColor_Origin(&point,&Color); DWORD red=Color&0x000000ff; DWORD green=Col

29、or&0x0000ff00; green=8; DWORD blue=Color&0x00ff0000; blue=16; Color=round(0.3*red+0.59*green+0.11*blue);red*=2;if (red255)red-=255;green*=2;if (green255)green-=255;blue*=2;if (blue255)blue-=255;green=8;blueSetColor_TrueColor(&point,Color);当然,其它格式的位图的灰度变换只需要改变语句1和2即可。(6)调用Invalidate() 函数响应OnDraw()函数在

30、屏幕上绘图。最后用EndWaitCursor() 函数对应BeginWaitCursor()函数。图(2)即为对应于图(1)的灰度处理后的图像。 2 5逆反处理逆反处理也是灰度处理的一种。它的原理是对于256色图像,当输入图像的象素的灰度值为a时,输出图像中该象素灰度值为255-a,即输入象素灰度值的逆反值。具体算法和程序流程如下:(1)先判断m_pBMPInfo(包含BMP图像数据的变量)中是否包含数据,因为图像处理都是处理m_pBMPInfo中的数据。语句如下: if(m_pBMPInfo=NULL) return;(2)通过BeginWaitCursor() 函数等待响应。(3)通过以下

31、语句段取得位图的长宽尺寸和格式 int dwWidth=m_pBMPInfo-bmiHeader.biWidth; int dwHeight=m_pBMPInfo-bmiHeader.biHeight; UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;(4)对24Bits位图格式和其它格式的位图图像进行不同的处理。对24Bits图像使用以下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。 (a)GetColor_TrueColor_Origin(&point,&Color) (b)GetColor_TrueColor(&point,Color) 对其它格式使用以下函数进行处理GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。(5)首先读取位图数据的点的象素值,进行逆反变换以后再以变换以后的象素值输出到原坐标点。24

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2