BMP图片处理C语言

上传人:文*** 文档编号:61997309 上传时间:2022-03-13 格式:DOC 页数:14 大小:28KB
收藏 版权申诉 举报 下载
BMP图片处理C语言_第1页
第1页 / 共14页
BMP图片处理C语言_第2页
第2页 / 共14页
BMP图片处理C语言_第3页
第3页 / 共14页
资源描述:

《BMP图片处理C语言》由会员分享,可在线阅读,更多相关《BMP图片处理C语言(14页珍藏版)》请在装配图网上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! BMP图片处理-C语言(存储于读写)(2009-10-19 15:32:29)C语言 BMP图片处理BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。这是最普通的生成位图的工具,在这里讲解的BMP位图形式,主要就是指用画图生成的位图(当然,也可以用其它工具软件生成)。现

2、在讲解BMP的4个组成部分:1.文件头信息块0000-0001:文件标识,为字母ASCII码“BM”。0002-0005:文件大小。0006-0009:保留,每字节以“00”填写。000A-000D:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。2.图像描述信息块000E-0011:图像描述信息块的大小,常为28H。0012-0015:图像宽度。0016-0019:图像高度。001A-001B:图像的plane(平面?)总数(恒为1)。001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。001E

3、-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。0022-0025:图像区数据的大小。0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。3.颜色表颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(像素的透明度值,一般不需要)。即首先4字

4、节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。4.图像数据区颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8。然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个:1.BMP文件记录一行图像是以字节为单位的。因

5、此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信息。2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。如果显示模式为16色,当图像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。如果显示模式为256色,当图像宽为19时,每行也要补充4-19%4=1个字节。还有一点我要申明,当屏幕初始化为16或25

6、6色模式时,一定要设置调色板或修正颜色值,否则无法得到正确的图像颜色。C代码/ReadBitMap/#include #include #include #include #include #define WIDTHBYTES(bits) (bits)+31)/32*4)typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned long DWORD;typedef long LONG;/位图文件头信息结构定义/其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)typedef

7、 struct tagBITMAPFILEHEADER DWORD bfSize; /文件大小WORD bfReserved1; /保留字,不考虑WORD bfReserved2; /保留字,同上DWORD bfOffBits; /实际位图数据的偏移字节数,即前三个部分长度之和 BITMAPFILEHEADER;/信息头BITMAPINFOHEADER,也是一个结构,其定义如下:typedef struct tagBITMAPINFOHEADER/public:DWORD biSize; /指定此结构体的长度,为40LONG biWidth; /位图宽LONG biHeight; /位图高WO

8、RD biPlanes; /平面数,为1WORD biBitCount; /采用颜色位数,可以是1,2,4,8,16,24,新的可以是32DWORD biCompression; /压缩方式,可以是0,1,2,其中0表示不压缩DWORD biSizeImage; /实际位图数据占用的字节数LONG biXPelsPerMeter; /X方向分辨率LONG biYPelsPerMeter; /Y方向分辨率DWORD biClrUsed; /使用的颜色数,如果为0,则表示默认值(2颜色位数)DWORD biClrImportant; /重要颜色数,如果为0,则表示所有颜色都是重要的 BITMAPI

9、NFOHEADER;/调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。/(似乎是调色板结构体个数等于使用的颜色数。)typedef struct tagRGBQUAD /public:BYTE rgbBlue; /该颜色的蓝色分量BYTE rgbGreen; /该颜色的绿色分量BYTE rgbRed; /该颜色的红色分量BYTE rgbReserved; /保留值 RGBQUAD;void showBmpHead(BITMAPFILEHEADER* pBmpHead)printf(位图文件头:n);printf(文件大小:%dn,pBmpHe

10、ad-bfSize);printf(保留字:%dn,pBmpHead-bfReserved1);printf(保留字:%dn,pBmpHead-bfReserved2);printf(实际位图数据的偏移字节数:%dn,pBmpHead-bfOffBits);void showBmpInforHead(tagBITMAPINFOHEADER* pBmpInforHead)printf(位图信息头:n);printf(结构体的长度:%dn,pBmpInforHead-biSize);printf(位图宽:%dn,pBmpInforHead-biWidth);printf(位图高:%dn,pBmpI

11、nforHead-biHeight);printf(biPlanes平面数:%dn,pBmpInforHead-biPlanes);printf(biBitCount采用颜色位数:%dn,pBmpInforHead-biBitCount);printf(压缩方式:%dn,pBmpInforHead-biCompression);printf(biSizeImage实际位图数据占用的字节数:%dn,pBmpInforHead-biSizeImage);printf(X方向分辨率:%dn,pBmpInforHead-biXPelsPerMeter);printf(Y方向分辨率:%dn,pBmpIn

12、forHead-biYPelsPerMeter);printf(使用的颜色数:%dn,pBmpInforHead-biClrUsed);printf(重要颜色数:%dn,pBmpInforHead-biClrImportant);void showRgbQuan(tagRGBQUAD* pRGB)printf(%-3d,%-3d,%-3d) ,pRGB-rgbRed,pRGB-rgbGreen,pRGB-rgbBlue);void main()BITMAPFILEHEADER bitHead;BITMAPINFOHEADER bitInfoHead;FILE* pfile;char strFi

13、le50;printf(please input the .bmp file name:n);scanf(%s,strFile);pfile = fopen(strFile,rb);/打开文件if(pfile!=NULL)printf(file bkwood.bmp open success.n);/读取位图文件头信息WORD fileType;fread(&fileType,1,sizeof(WORD),pfile);if(fileType != 0x4d42)printf(file is not .bmp file!);return;/fseek(pfile,2,SEEK_CUR); /

14、BMfread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);showBmpHead(&bitHead);printf(nn);/读取位图信息头信息fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);showBmpInforHead(&bitInfoHead);printf(n);elseprintf(file open fail!n);return;tagRGBQUAD *pRgb ;if(bitInfoHead.biBitCount 24)/有调色板/读取调色盘结信息long nPlantN

15、um = long(pow(2,double(bitInfoHead.biBitCount); / Mix color Plant Number;pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD);memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD);int num = fread(pRgb,4,nPlantNum,pfile);printf(Color Plate Number: %dn,nPlantNum);printf(颜色板信息:n);for (int i =0; inPlantNum;i+)if

16、 (i%5=0)printf(n);showRgbQuan(&pRgbi);printf(n);int width = bitInfoHead.biWidth;int height = bitInfoHead.biHeight;/分配内存空间把源图存入内存int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);/计算位图的实际宽度并确保它为32的倍数BYTE *pColorData=(BYTE *)malloc(height*l_width);memset(pColorData,0,height*l_width);long nData =

17、 height*l_width;/把位图数据信息读到数组里fread(pColorData,1,nData,pfile);/将位图数据转化为RGB数据tagRGBQUAD* dataOfBmp;dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD);/用于保存各像素对应的RGB数据memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD);if(bitInfoHead.biBitCount24)/有调色板,即位图为非真彩色int k;int index = 0;if (bitIn

18、foHead.biBitCount = 1)for(int i=0;iheight;i+)for(int j=0;jwidth;j+)BYTE mixIndex= 0;k = i*l_width + j/8;/k:取得该像素颜色数据在实际数据数组中的序号/j:提取当前像素的颜色的具体值mixIndex = pColorDatak;switch(j%8)case 0:mixIndex = mixIndex7;break;case 1:mixIndex = mixIndex7;break;case 2:mixIndex = mixIndex7;break;case 3:mixIndex = mix

19、Index7;break;case 4:mixIndex = mixIndex7;break;case 5:mixIndex = mixIndex7;break;case 6:mixIndex = mixIndex7;break;case 7:mixIndex = mixIndex7;break;/将像素数据保存到数组中对应的位置dataOfBmpindex.rgbRed = pRgbmixIndex.rgbRed;dataOfBmpindex.rgbGreen = pRgbmixIndex.rgbGreen;dataOfBmpindex.rgbBlue = pRgbmixIndex.rgbB

20、lue;dataOfBmpindex.rgbReserved = pRgbmixIndex.rgbReserved;index+;if(bitInfoHead.biBitCount=2)for(int i=0;iheight;i+)for(int j=0;jwidth;j+)BYTE mixIndex= 0;k = i*l_width + j/4;/k:取得该像素颜色数据在实际数据数组中的序号/j:提取当前像素的颜色的具体值mixIndex = pColorDatak;switch(j%4)case 0:mixIndex = mixIndex6;break;case 1:mixIndex =

21、mixIndex6;break;case 2:mixIndex = mixIndex6;break;case 3:mixIndex = mixIndex6;break;/将像素数据保存到数组中对应的位置dataOfBmpindex.rgbRed = pRgbmixIndex.rgbRed;dataOfBmpindex.rgbGreen = pRgbmixIndex.rgbGreen;dataOfBmpindex.rgbBlue = pRgbmixIndex.rgbBlue;dataOfBmpindex.rgbReserved = pRgbmixIndex.rgbReserved;index+;

22、if(bitInfoHead.biBitCount = 4)for(int i=0;iheight;i+)for(int j=0;jwidth;j+)BYTE mixIndex= 0;k = i*l_width + j/2;mixIndex = pColorDatak;if(j%2=0)/低mixIndex = mixIndex4;else/高mixIndex = mixIndex4;dataOfBmpindex.rgbRed = pRgbmixIndex.rgbRed;dataOfBmpindex.rgbGreen = pRgbmixIndex.rgbGreen;dataOfBmpindex

23、.rgbBlue = pRgbmixIndex.rgbBlue;dataOfBmpindex.rgbReserved = pRgbmixIndex.rgbReserved;index+;if(bitInfoHead.biBitCount = 8)for(int i=0;iheight;i+)for(int j=0;jwidth;j+)BYTE mixIndex= 0;k = i*l_width + j;mixIndex = pColorDatak;dataOfBmpindex.rgbRed = pRgbmixIndex.rgbRed;dataOfBmpindex.rgbGreen = pRgb

24、mixIndex.rgbGreen;dataOfBmpindex.rgbBlue = pRgbmixIndex.rgbBlue;dataOfBmpindex.rgbReserved = pRgbmixIndex.rgbReserved;index+;if(bitInfoHead.biBitCount = 16)for(int i=0;iheight;i+)for(int j=0;jwidth;j+)WORD mixIndex= 0;k = i*l_width + j*2;WORD shortTemp;shortTemp = pColorDatak+1;shortTemp = shortTemp

25、8;mixIndex = pColorDatak + shortTemp;dataOfBmpindex.rgbRed = pRgbmixIndex.rgbRed;dataOfBmpindex.rgbGreen = pRgbmixIndex.rgbGreen;dataOfBmpindex.rgbBlue = pRgbmixIndex.rgbBlue;dataOfBmpindex.rgbReserved = pRgbmixIndex.rgbReserved;index+;else/位图为24位真彩色int k;int index = 0;for(int i=0;iheight;i+)for(int

26、 j=0;jwidth;j+)k = i*l_width + j*3;dataOfBmpindex.rgbRed = pColorDatak+2;dataOfBmpindex.rgbGreen = pColorDatak+1;dataOfBmpindex.rgbBlue = pColorDatak;index+;printf(像素数据信息:n);for (int i=0; iwidth*height; i+)if (i%5=0)printf(n);showRgbQuan(&dataOfBmpi);fclose(pfile);if (bitInfoHead.biBitCount24)free(pRgb);free(dataOfBmp);free(pColorData);printf(n);14 / 14

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!