C语言实现BMP图像显示软件课程设计

上传人:cn****1 文档编号:498171770 上传时间:2024-02-17 格式:DOC 页数:7 大小:32.50KB
返回 下载 相关 举报
C语言实现BMP图像显示软件课程设计_第1页
第1页 / 共7页
C语言实现BMP图像显示软件课程设计_第2页
第2页 / 共7页
C语言实现BMP图像显示软件课程设计_第3页
第3页 / 共7页
C语言实现BMP图像显示软件课程设计_第4页
第4页 / 共7页
C语言实现BMP图像显示软件课程设计_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《C语言实现BMP图像显示软件课程设计》由会员分享,可在线阅读,更多相关《C语言实现BMP图像显示软件课程设计(7页珍藏版)》请在金锄头文库上搜索。

1、C语言实现BMP图像显示软件课程设计1.设计任务1.1利用C语言实现BMP格式图象文件的分析和显示。 主要内容包括: 1)基本任务:完成BMP格式图像的显示,要求在提供的画布上循环的显示某一文件夹下面所有的BMP文件(支持所有BMP格式); 2)拓展任务:实现图像的特效显示(淡入淡出,百页窗等)。 2. 基本思路 要实现在画布上显示BMP图像,利用描点函数GFMSetPixels,逐个显示出BMP图像的点,最终构成一幅完整的图像。3. 方案设计3.1 主要算法说明:主要方法:将不同像素的图像分别用不同的函数实现,即分别定义show1bit,show4bit,show32bit等几个函数,再定义

2、函数showbmp,按照需要显示的图像像素,决定调用相应的图像显示函数。这么做可以使结构比较清晰,增强代码的可读性。具体实现方法:(1)定义信息头结构变量(其中变量包含BMP图像的文件头和信息头:文件标识“BM”,文件大小,保留位,数据偏移,信息头长度,宽度,高度,面数,像素的位数,压缩类型,位图数据大小,水平分辨率,垂直分辨率,颜色数,重要颜色)(2)定义函数,读取文件头和信息头(3)定义各个像素BMP图像的显示函数3.2 程序框架设计 总体流程开始调用信息头读取函数读取图像文件头信息根据信息头中的数据判断图像的颜色深度调用相应的图像显示函数结束4. 程序的部分源代码分析及介绍4.1 主要显

3、示函数showbmpvoid showbmp(char *filename)/图像显示函数 FILE * fp; struct Filehead point; Readhead(filename,&point);/调用头信息读取函数获得图像头信息 if(fp=fopen(filename,rb)=NULL) printf(can not open); exit(1); switch(point.bmppix)/判断图像的颜色像素,决定使用哪个图像显示函数 case 1:/若像素为1,调用1bit图像显示函数 show1bit(filename,&point);break; /其余调用类似,这里

4、省略关键是利用图像信息头中的bmppix(像素位数)来判断应当调用哪个图像显示函数4.2 32bit图像显示函数void show32bit(char*filename,struct Filehead* point)/显示32bit图像的函数 FILE*fp; INT32U color; INT32U i,j; if(fp=fopen(filename,rb)=NULL) printf(can not open the file!); exit(1); fseek(fp,point-remove,0);/跳过文件头信息头数据区 for(i=0;ibmpheight;i+) for(j=0;jb

5、mpwidth;j+) fread(&color,4,1,fp);/每次读取4个字节(即32bit)的数据 GFMSetPixels(color,j,point-bmpheight-i,1); fclose(fp);关键是用fseek跳过信息头,还有注意BMP图像读取时是从左下角开始的。 24bit图像显示函数与32bit基本一样,在第三部分已做过说明,这里不再赘述。4.3 8bit图像显示函数void show8bit(char*filename,struct Filehead* point) FILE*fp; INT32U color,pcolor; INT32U i,j; INT32U

6、colorboard256;/存放调色板数据的数组 if(fp=fopen(filename,rb)=NULL) printf(can not open the file!); exit(1); fseek(fp,0x36,0); for(i=0;iremove,0);/跳过信息头和调色板 for(i=0;ibmpheight;i+) for(j=0;jbmpwidth+1;j+) fread(&pcolor,1,1,fp);/读取一个位图数据 color=colorboardpcolor&0xff;/取读出的数据的一位,对应到调色板的一个颜色 if(jbmpwidth)GFMSetPixel

7、s(color,j,point-bmpheight-i,1); 关键是定义数组来存放调色板的数据,然后在读取位图数据时对应到调色板中的颜色。4bit显示函数与8bit思路一致,但要注意有位运算。fread(&pcolor,1,1,fp);/读取一个位图数据pcolor41=pcolor4&0x0f;/取出数据的前面4bitcolor=colorboardpcolor41;/对应到调色板的一个颜色if(jbmpwidth) GFMSetPixels(color,2*j,point-bmpheight-i,1);pcolor42=pcolor&0x0f;/取出数据的后面4bitcolor=colo

8、rboardpcolor42;/对应到调色板的一个颜色if(jbmpwidth) GFMSetPixels(color,2*j+1,point-bmpheight-i,1);1bit图像显示类似。4.4 8bit(压缩)图像显示函数void show8rlebit(char*filename,struct Filehead* point)/相同部分省略 INT8U colornum,samecolor, iremove,jremove, pcolor;/定义相同颜色数目,颜色索引,行列偏移量等/读取调色板数据与未压缩的一样,这里省略j=0;for(i=0;ibmpheight;)fread(&

9、colornum,1,1,fp);/读取第一个相同颜色数的数据if(colornum=0)/判断若为0,联合第二个字节判断fread(&samecolor,1,1,fp);/读取第二个字节if(samecolor=0)/第二个字节为0,表示行结束i+;j=0;else if(samecolor=1)/第二个字节为1,表示RLE编码图像结束break;else if(samecolor=2)/*第二个字节为2,其后的两个字节表示下一个象素从当前开始的水平和垂直位置的偏移量*/fread(&jremove,1,1,fp);fread(&iremove,1,1,fp);i+=iremove;j+=j

10、remove;else/若第二个字节大于2,则第二个字节表示其后有效的颜色数据 for(a=0;abmpheight-i,1);/画出解压缩以后的点j+;if(samecolor%2!=0) /若samecolor为奇数,再读取一个字节、fread(&pcolor,1,1,fp);else/相同颜色数目不为零,后一字节表示颜色索引fread(&samecolor,1,1,fp);/读取颜色索引数据 for(a=0;abmpheight-i,1);j+;fclose(fp);4bit压缩与8bit类似,不同点如下:for(a=0;asamecolor;a+)if(a%2=0)/a为偶数,即第1,

11、3,5,个颜色,对应高四位颜色 fread(&pcolor,1,1,fp); pcolor1=(pcolor&0xf0)bmpheight-i,1);/画出解压缩以后的点 j+; else/第2,4,6个颜色对应低四位 color2=colorboardpcolor2; GFMSetPixels(color2,j,point-bmpheight-i,1); j+; if(samecolor%4=1|samecolor%4=2)fread(&pcolor,1,1,fp);4.5 16bit(1555,4444,565模式)图像显示函数void show16bit(char*filename,struct Filehead* point)/定义各种变量,打开文件等,与前面类似,这里省略 fseek(fp,point-remove,0); if(point-bmprletype=0)/1555类型 for(i=0;ibmpheight;i+) for(j=0;jbmpwidth+1);j+) fread(&color,2,1,fp);/读取2个字节的颜色数据RGBcolor=(color&0x7c00)9)+(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 演讲稿/致辞

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号