收藏 分销(赏)

BMP软件专业课程设计中期报告集成彭宜脉.docx

上传人:二*** 文档编号:4516514 上传时间:2024-09-26 格式:DOCX 页数:13 大小:23.79KB
下载 相关 举报
BMP软件专业课程设计中期报告集成彭宜脉.docx_第1页
第1页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、华中科技大学软件课程设计中期汇报( - 年度第 一 学期)名 称: 软件课程设计中期汇报 题 目: BMP图像分析和显示 院 系: 光学和电子信息学院 班 级: 集成1101 学 号: U13995 学生姓名: 彭宜脉 指导老师: 陶雄飞 设计周数: 10 成 绩: 日期: 年 11 月 4 日目 录1.任务概述2.bmp显示基础原理3.方案设计3.1关键算法说明3.2程序大致步骤4.常见问题及其解答5.个人体会及提议6.参考文件(一)任务概述利用C语言实现BMP图片分析和显示中期汇报要求能够显示多个不一样位数bmp文件即可,上不要求对其进行特效修饰。(二)bmp显示基础原理 经过上网、书籍查

2、询,我将程序编写归纳为以下多个步骤来完成:1、 编写主显示函数,经过文件函数fread()读取图像文件头和信息头,以供显示函数使用;2、 添加反转函数确保复制数据时不会造成图像颠倒;3、 依据图像不一样位数,编写不一样分析和显示函数;4、 编写特效显示函数;(临时不添加)5、 对程序进行调试并优化。(三) 方案设计3.1 关键算法说明1、 定义文件头和信息头结构体,以下列代码struct file /定义文件头结构体INT16U bmptype;INT32U filesize;INT32U remainsegment;INT32U offset; fh;struct infom /定义信息头结

3、构体INT32U headersize;INT32U width;INT32U height;INT16U pagenum;INT16U bitcount;INT32U compression;INT32U datasize;INT32U sp_fbl;INT32U cz_fbl;INT32U colournum;INT32U impcol;bh;2、 主显示函数:经过文件函数fread()读取图像文件头和信息头。该步骤倚赖和上一步骤建立起结构体,所以简练有效结构体显得很关键。 void showbmp(INT8U * acMASK)FILE * fp;INT8U * pic;if(fp=fo

4、pen(acMASK,rb)=NULL)printf(fail to open);exit(0);fread(&(fh.bmptype),2,1,fp); /读取文件头信息fread(&(fh.filesize),4,1,fp);fread(&(fh.remainsegment),4,1,fp); fread(&(fh.offset),4,1,fp);fread(&(bh.headersize),4,1,fp); /读取信息头信息 fread(&(bh.width),4,1,fp);fread(&(bh.height),4,1,fp); fread(&(bh.pagenum),2,1,fp);

5、 fread(&(bh.bitcount),2,1,fp); fread(&(pression),4,1,fp);fread(&(bh.datasize),4,1,fp);fread(&(bh.sp_fbl),4,1,fp);fread(&(bh.cz_fbl),4,1,fp);fread(&(bh.colournum),4,1,fp);fread(&(bh.impcol),4,1,fp);. /以下为不一样位数显示函数,能够以特效方法显示3、 编写一个翻转函数。因为读取图像信息时是从图片左下角开始,最终读取右上角数据。而显示函数则是从画布左上角开始复制图片信息。假如直接显示,将看到一张倒置图

6、片。所以需要一个翻转函数,将图片左上角信息和左下角信息依次调换: void convert(INT32U width,INT32U height,INT8U * pic) INT32U i,j,a,b;INT8U temp,*temp1,*temp2;a=720/2-width/2; b=576/2-height/2; temp1=temp2=pic; for(i=0;iheight/2;i+) temp1=pic+4*(height-i-1)*width; temp2=pic+4*i*width; for(j=0;j4*width;j+) temp=*(temp1+j);*(temp1+j)

7、=*(temp2+j);*(temp2+j)=temp; 4、 依据图像不一样位数,编写不一样分析和显示函数。 BMP图像包含1位、4位、8位、16位、24位、32位。(1)对于32位图像,能够经过GFMWriteRectangle函数直接在画布上显示:if(bh.bitcount=32) INT32U i;fseek(fp,fh.offset,0);pic=malloc(bh.datasize); fread(pic,4,(bh.width)*(bh.height),fp);convert(bh.width),(bh.height),pic); /翻转函数将图片正置 GFMDrawRecta

8、ngle(0,0,720,576,0x00000000,1); GFMWriteRectangle(a,b,rect,pic,bh.width,bh.height); /显示函数 free(pic); 而其它位数图像不能直接在画布上显示,所以能够经过将其它位数图像转化为32位进行显示。其中16、24位全部不需要调色板。(2) 对于24位,我们需要经过补零得到32位,进而显示,其操作过程代码以下:if(bh.bitcount=24). /读取信息过程,这里给予省略)for(i=0;ibh.height;i+)temp1=pic+4*i*bh.width; temp2=temp+i*(3*(bh.

9、width)+m); for(j=0,k=0;j3*(bh.width);j+)*(temp1+k)=*(temp2+j);k+;if(j+1)%3=0)*(temp1+k)=0;k+; / 补零操作过程 . /显示方法和32位大致相同,此处省略(3)对于16位,首先经过biCompression值判定其为RGB1555、RGB565、RGB4444中哪一个类型,然后采取对应移位和和运算方法读取RGB值,再转化为32位显示。if(bh.bitcount=16) . /读取文件头信息头,此处省略switch(pression) /分为1555、565、4444三种格式分析case 0: /155

10、5格式for(i=0;ibh.height;i+)temp2=(INT16U *)(temp+i*(2*bh.width+m);temp0=(INT32U *)(pic+i*4*bh.width);for(j=0;jbh.width;) INT32U s;INT32U a,b,c;s=*(temp2); a=(s&0x7C00)9; /经过和和移位操作分别得到各颜色分量值 b=(s&0x03E0)6; c=(s&0x001F)3;*(temp0)=a+b+c; /各颜色分量值相加记得一个像素值 temp0+;temp2+;j+; /以上为1555格式对应移位和运算方法./ 以下为显示函数,此处

11、略break; case 3:if(*(temp1)=0xF800) /565格式 . /处理方法同上,此处省略break; if(*(temp1)= 0x0F00) /4444格式 /省略break; (4)而对于8位和4位图,我们首先需要判定图片是否压缩,无压缩图片我们也只需要经过位图数据得到颜色真实值即可,对于压缩图片,则需要解压缩到索引号,然后经过调色板转化为颜色真实值;对于1位图,我们也只需要经过位图数据即索引号得到颜色真实值即可。另外,因为windows要求bmp图片位图数据每行必需4个字节整数倍,所以对于32位之外其它位图全部有补零,所以要经过移位跳过无用数据。以下以8位图为例:

12、if(bh.bitcount=8)if(pression=0) /无压缩图片. /读取信息过程,略for(i=0;ibh.height;i+)for(j=0;jbh.width;)INT8U s;fread(&s,1,1,fp); /每循环一次,读取一个字节位图数据,作为调色板索引号*temp2=temp1s; j+;temp2+;if(j=bh.width) /读完有用数据,经过偏移指针跳过补齐零 fseek(fp,m,1); /显示函数,略if(pression=1) /有压缩图片. /不一样之处是要读取调色板数据for(i=0;ibh.height;i+)temp2=(INT32U*)(

13、pic+i*4*bh.width);for(j=0;jbh.width;)a=*temp0; /读取第一个字节信息temp0+;b=*temp0; /读取第二个字节信息temp0+;if(a!=0)for(k=0;k=3) /当第一个字节为零,第二个字节大于或等于3时,赋b个像素值for(k=0;kb;k+)c=*temp0;temp0+;*(temp2)=temp1c;j+;temp2+;if(b%2=1) /若像素数不是2地整数倍,则跳过对应补齐零 temp0+; if(a=0&b=0) break;. /显示函数,略3.2 程序大致步骤建立结构 读取文件信息(文件头和信息头) 依据位数选

14、择显示函数 得到显示图片 翻转函数convert 实现图片正置(四) 常见问题及其解答在课题中首先碰到问题就是相关图片正置,为此我还上网查找了很多资料,对其消化了解以后才成功实现了点交换,而且意识到显示函数跟翻转函数其实能够在同一函数框架下完成。然后就是多种程序小瑕疵问题。程序大致思绪比较轻易确定,不过想要成功显示图片就很含有挑战性了。我是先自己编写原创代码,经过调试一步步实施想要功效;碰到瓶颈时就经过手头资料,观摩其它人代码是怎样完成工作,并找出其中比我高效、整齐之处,再对自己代码加以修改。(五)个人体会及提议 这个课题大部分知识并不在课程体系之内,所以一开始是肯定会碰到部分困难。我在逐步了

15、解自己工作内容同时,也对软件课程设计这一门课有了自己心得体会。其中,我认为最关键就是把握整个程序关键内容和大致结构。关键内容,即指整个程序所建立在其之上基础函数,对于调用函数,一定要熟练利用,才能在以后扩展方面很快地达成自己想要效果。而快速了解程序大致结构,则有利于把握程序走向,一步一个脚印循序渐进,以避免一开始就撞上比较困难关节。这也是给自己信心、和合理计划时间前提确保。其实对于C语言很多基础内容,我全部是半生不熟,以致于在编写程序时需要回头去翻找教材来解疑。但以后一想,其实在以后工作学习里很多时候情况正如此,需要先知道目标,然后有目标充实自己。这么学习方法比一味用知识点填充自己要高效得多。这么一来,即使碰到部分难以克服困难,在心态上我还是比较主动。最终,我得到另一点关键心得就是要充足利用身边学习资源。老师、同学,网络、书籍,全部能够成为我们很好地学习助力。很多时候,借助已经有资源能很好地修改自己不足。但借鉴不等于照抄,需要把握住自己对于程序了解,这才是最关键一点。(六)参考文件 1 周纯杰、刘正林等 标准C语言程序设计及应用 华中科技大学出版社 3月第一版。 2 谭浩强. c程序设计(第二版).北京:清华大学出版社.1999

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服