收藏 分享(赏)

BMP图像的读写(8位和24位).doc

上传人:精品资料 文档编号:8598135 上传时间:2019-07-04 格式:DOC 页数:14 大小:297KB
下载 相关 举报
BMP图像的读写(8位和24位).doc_第1页
第1页 / 共14页
BMP图像的读写(8位和24位).doc_第2页
第2页 / 共14页
BMP图像的读写(8位和24位).doc_第3页
第3页 / 共14页
BMP图像的读写(8位和24位).doc_第4页
第4页 / 共14页
BMP图像的读写(8位和24位).doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、南通大学计算机科学与技术学院数字图像处理课程实验报 告 书实 验 名 BMP 文件的读写(8 位和 24位) 班 级 计 121 姓 名 张 进 学 号 1213022016 2014年 6月 16 日1、实验内容1、了解 BMP 文件的结构2、8 位位图和 24 位位图的读取2、BMP 图形文件简介BMP(Bitmap-File)图形文件是 Windows 采用的图形文件格式,在 Windows 环境下运行的所有图象处理软件都支持 BMP 图象文件格式。Windows 系统内部各图像绘制操作都是以 BMP 为基础的。Windows 3.0 以前的 BMP 图文件格式与显示设备有关,因此把这种

2、BMP 图象文件格式称为设备相关位图 DDB(device-dependent bitmap)文件格式。Windows 3.0 以后的 BMP 图象文件与显示设备无关,因此把这种 BMP 图象文件格式称为设备无关位图 DIB(device-independent bitmap)格式(注:Windows 3.0 以后,在系统中仍然存在 DDB位图,象 BitBlt()这种函数就是基于 DDB 位图的,只不过如果你想将图像以 BMP 格式保存到磁盘文件中时,微软极力推荐你以 DIB 格式保存),目的是为了让 Windows 能够在任何类型的显示设备上显示所存储的图象。BMP 位图文件默认的文件扩展

3、名是 BMP 或者bmp(有时它也会以.DIB 或.RLE 作扩展名)。 位图文件可看成由 4 个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table) 和定义位图的字节阵列,它具有如下所示的形式。 位图文件的组成 结构名称 符号 位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh位图信息头(bitmap-information header) BITMAPINFOHEADER bmih彩色表(color table) RGBQUAD aColo

4、rs图象数据阵列字节 BYTE aBitmapBits位图文件结构内容摘要 偏移量 域的名称 大小 内容 图象文件 头0000h 文件标识 2 bytes两字节的内容用来识别位图的类型: BM : Windows 3.1x, 95, NT, BA :OS/2 Bitmap Array CI :OS/2 Color Icon CP :OS/2 Color Pointer IC : OS/2 Icon PT :OS/2 Pointer注:因为 OS/2 系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。0002h File Size 1 dword 用字节表示的整个文件的大小00

5、06h Reserved 1 dword 保留,必须设置为 0000Ah Bitmap Data Offset 1 dword 从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量000Eh Bitmap Header Size 1 dword位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示: 28h - Windows 3.1x, 95, NT, 0Ch - OS/2 1.x F0h - OS/2 2.x注:在 Windows95、98、2000 等操作系统中,位图信息头的长度并不一定是 28h,因为微软已经制定出了

6、新的BMP 文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数 28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。0012h Width 1 dword 位图的宽度,以象素为单位0016h Height 1 dword 位图的高度,以象素为单位001Ah Planes 1 word 位图的位面数(注:该值将总是 1)图象 信息 头 001Ch Bits Per Pixel 1 word每个象素的位数 1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色) 4 - 16 色位图 8 - 256 色位图 16 - 16bit

7、 高彩色位图 24 - 24bit 真彩色位图 32 - 32bit 增强型真彩色位图001Eh Compression 1 dword压缩说明: 0 - 不压缩 (使用 BI_RGB 表示) 1 - RLE 8-使用 8 位 RLE 压缩方式(用 BI_RLE8 表示) 2 - RLE 4-使用 4 位 RLE 压缩方式(用 BI_RLE4 表示) 3 - Bitfields-位域存放方式 (用 BI_BITFIELDS 表示)0022h Bitmap Data Size 1 dword 用字节数表示的位图数据的大小。该数必须是 4 的倍数0026h HResolution 1 dword

8、用象素/米表示的水平分辨率002Ah VResolution 1 dword 用象素/米表示的垂直分辨率002Eh Colors 1 dword 位图使用的颜色数。如 8-比特/ 象素表示为 100h 或者 256.0032h Important Colors 1 dword 指定重要的颜色数。当该域的值等于颜色数时(或者等于0 时),表示所有颜色都一样重要调色板数据根据BMP 版本的不Palette N * 4 byte调色板规范。对于调色板中的每个表项,这 4 个字节用下述方法来描述 RGB 的值: 1 字节用于蓝色分量同而不同1 字节用于绿色分量1 字节用于红色分量1 字节用于填充符(设

9、置为 0)图象数据根据BMP 版本及调色板尺寸的不同而不同Bitmap Data xxx bytes该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的 RGB 值,这将根据图像信息头中的位深度值来决定。3、读写涉及的原理1、 图像的二值化的基本原理图像的二值化处理就是讲图像上的点的灰度置为 0 或 255,也就是讲整个图像呈现出明显的黑白效果。即将 256 个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二

10、值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为 0 或 255 的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为 255 表示,否则这些像素点被排除在物体区域以外,灰度值为 0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割

11、效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。2、 图像的反色原理对于彩色图像的 R、G、B 各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。如物体连通域用黑色表示,而二值化后的物体连通域图像可那是白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理四、读写转换代码#include#include #include #inclu

12、de #include #include #include #include /-/以下该模块是完成 BMP 图像(彩色图像是 24bit RGB 各 8bit)的像素获取,并存在文件名为xiang_su_zhi.txt 中unsigned char *pBmpBuf;/读入图像数据的指针int bmpWidth;/图像的宽int bmpHeight;/图像的高RGBQUAD *pColorTable;/颜色表指针int biBitCount;/图像类型,每像素位数/-/读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中bool readBmp(char *bmp

13、Name) FILE *fp=fopen(bmpName,“rb“);/二进制读方式打开指定的图像文件if(fp=0)return 0;/跳过位图文件头结构 BITMAPFILEHEADERfseek(fp, sizeof(BITMAPFILEHEADER),0);/定义位图信息头结构变量,读取位图信息头进内存,存放在变量 head 中BITMAPINFOHEADER head; fread( /获取图像宽、高、每像素所占位数等信息bmpWidth = head.biWidth;bmpHeight = head.biHeight;biBitCount = head.biBitCount;/定义

14、变量,计算图像每行像素所占的字节数(必须是 4的倍数)int lineByte=(bmpWidth * biBitCount/8+3)/4*4;/灰度图像有颜色表,且颜色表表项为256if(biBitCount=8)/申请颜色表所需要的空间,读颜色表进内存pColorTable=new RGBQUAD256;fread(pColorTable,sizeof(RGBQUAD),256,fp);/申请位图数据所需要的空间,读位图数据进内存pBmpBuf=new unsigned charlineByte * bmpHeight;fread(pBmpBuf,1,lineByte * bmpHeigh

15、t,fp);fclose(fp);/关闭文件return 1;/读取文件成功/-/给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)/如果位图数据指针为 0,则没有数据传入,函数返回if(!imgBuf)return 0;/颜色表大小,以字节为单位,灰度图像颜色表为 1024 字节,彩色图像颜色表大小为0int colorTablesize=

16、0;if(biBitCount=8)colorTablesize=1024;/待存储图像数据每行字节数为 4 的倍数int lineByte=(width * biBitCount/8+3)/4*4;/以二进制写的方式打开文件FILE *fp=fopen(bmpName,“wb“);if(fp=0)return 0;/申请位图文件头结构变量,填写文件头信息BITMAPFILEHEADER fileHead;fileHead.bfType = 0x4D42;/bmp 类型/bfSize 是图像文件 4 个组成部分之和fileHead.bfSize= sizeof(BITMAPFILEHEADER

17、) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;/bfOffBits 是图像文件前 3 个部分所需空间之和fileHead.bfOffBits=54+colorTablesize;/写文件头进文件fwrite(/申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head; head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUse

18、d=0;head.biCompression=0;head.biHeight=height;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;/写位图信息头进内存fwrite(/如果灰度图像,有颜色表,写入文件 if(biBitCount=8)fwrite(pColorTable, sizeof(RGBQUAD),256, fp);/写位图数据进文件fwrite(imgBuf, heigh

19、t*lineByte, 1, fp);/关闭文件fclose(fp);return 1;/-/以下为像素的读取函数void doIt()/读入指定 BMP 文件进内存char readPath=“D:pic24dog.BMP“;readBmp(readPath);/输出图像的信息couthang-8;L1-)/8*8 矩阵行for(int L2=lie;L2lie+8;L2+)/8*8 矩阵列m=*(pBmpBuf+L1*lineByte+L2);outfilem“ “;count_xiang_su+;if(count_xiang_su%8=0)/每 8*8 矩阵读入文本文件outfileen

20、dl;/-hang=63-fen_ge_hang*8;/64*64 矩阵行变换lie+=8;/64*64 矩阵列变换/该一行(64)由 8 个 8*8 矩阵的行组成hang-=8;/64*64 矩阵的列变换lie=0;/64*64juzhen/double xiang_su2048;/ofstream outfile(“xiang_su_zhi.txt“,ios:in|ios:trunc);if(!outfile)cout“open error!“endl;exit(1);else if(biBitCount=24)/彩色图像for(int i=0;ibmpHeight;i+)for(int

21、j=0;jbmpWidth;j+)for(int k=0;k3;k+)/每像素 RGB 三个分量分别置 0 才变成黑色/*(pBmpBuf+i*lineByte+j*3+k)-=40;m=*(pBmpBuf+i*lineByte+j*3+k);outfilem“ “;count_xiang_su+;if(count_xiang_su%8=0)outfileendl;/n+;n+;cout“总的像素个素为:“nendl;cout“-“endl;/将图像数据存盘char writePath=“D:pic24newdog.BMP“;/图片处理后再存储saveBmp(writePath, pBmpBu

22、f, bmpWidth, bmpHeight, biBitCount, pColorTable);/清除缓冲区,pBmpBuf 和 pColorTable 是全局变量,在文件读入时申请的空间delete pBmpBuf;if(biBitCount=8)delete pColorTable;void main()doIt();五、运行结果24 位位图 24dog.bmp 如下:原图像的属性:读取结果:生成的新图片:8 位位图读取 8dog.bmp 如下图片属性:读取的结果:生成的新图片:6、心得体会大一学的 c+,现在却发现忘得差不多了,在程序实现上遇到了困难。但是本次实验确实又再一次的让我接触了 c 语言。这次实验掌握了 BMP 文件的读取,第一次对图像有这么深的认识了解。对图像的组成不再是以前那种错误的认识,有收获。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报