C语言软件课程设计(BMP图像显示)-终期报告.doc_第1页
C语言软件课程设计(BMP图像显示)-终期报告.doc_第2页
C语言软件课程设计(BMP图像显示)-终期报告.doc_第3页
C语言软件课程设计(BMP图像显示)-终期报告.doc_第4页
C语言软件课程设计(BMP图像显示)-终期报告.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XX大学XX系课程设计报告( 2010- 2011年度第2学期)名 称: 软件课程设计 题 目:BMP图象分析与显示院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 第十五周 成 绩: 日期:2011年6月4日目 录1.设计任务12.基本思路13.方案设计23.1定义文件头和信息头23.2判断位图颜色深度(或类型)23.3位图数据分析和显示34.程序的源代码65.调试过程中出现的问题及相应解决办法66.个人体会及建议7参考文献991. 设计任务1) 设计题目:BMP图象分析与显示2) 设计任务:在提供的画布上循环的显示某一文件夹下面所有的BMP 文件(支持所有BMP格式)3) 完成情况:所有的图片均能正常显示(包括新添的图片),尝试在32位图片上做了几种特效,效果还行,但仍需进一步改进。2. 基本思路BMP 文件是标准的Windows位图文件,有1位、16色(4位)、256色(8位)、16位真彩色及24位真彩色,32位等格式。一般BMP文件可以看成4 个部分组成:1) BMP文件头(定义图像文件的类型、长度等的数据结构)2) BMP信息头 (定义图像颜色格式、图像大小、颜色数等的数据结构)3) 颜色表(调色板) (定义图像颜色的调色板的数组位图点阵,是定义图像数据的数组)32位和24位无调色板,16位为颜色掩码4) 定义BMP位图数据(未经压缩的BMP文件中,位图点阵信息是按扫描线从下至上(bottom to top)存储的,即图像的第一个像素值在位图阵列的左下角,最后一个像素值在位图阵列的右上角。对16色位图,每个像素占4位,每个字节存放相邻的两个像素值,高4位存放的第1个像素值在扫描线的前面,低4位存放的第2个像素值在扫描线后面。对256色位图,1个字节存放1个像素值。对24位位图,颜色表为空,位图数据的每3个字节对应1个像素值,32位,颜色表也为空,位图数据的每4个字节对应1个像素值其中每个字节,分别对应该像素值的、R、G,B值。)根据BMP文件头和信息头中的提取的数据可以判断位图的颜色深度及压缩类型不同的图像格式有不同的颜色表示方式,将其解压缩或者转换成对应的像素值,并用画点函数将其显示出来。3. 方案设计读取位图数据,做相应处理,画点主要算法说明:整体程序流程判断位图深度及压缩类型读取文件头和信息头 3.1 定义文件头和信息头#pragma pack (1)/取消字节对齐typedef struct /信息头信息INT16U bmpfiletype;/文件标识INT32U filescale;/BMP文件大小Filehead ;#pragma pack ()/恢复四位字节对齐point = malloc(sizeof(Filehead); /分配内存fp=fopen(filename,rb);/打开文件fread(point,sizeof(Filehead),1,fp);/读取文件头和信息头因为计算机(32位)读取数据时,一般是4个字节一起读取,所以要取消字节对齐,这样在读取时,计算机就会按照我们自己规定的数组长度将数据读进去,然后再恢复4字节对齐。3.2 判断位图颜色深度(或类型)switch (point-bmppix) /判断位图颜色深度(或类型)case 0x20:/32位case 0x18:/24位case 0x10:/16位 if(point-bmprletype=0) /1555格式else if(point-bmprletype=3) if(pal16=0xf800)/565模式else if(pal16!=0xf800)/4444模式case 0x08:/8位if(point-bmprletype=0)/未压缩else 压缩格式case 0x04:/4位if(point-bmprletype=0)/未压缩else if(point-bmprletype=2)/压缩格式case 0x01:/1位3.3 位图数据分析和显示1) 无调色板,以24位为例:GFMDrawRectangle(0,0,720,580, 0xff000000, 1); /创建黑色画布z=(4-(point-bmpwidth*3)%4)%4; /z为调整位图宽度的参数for(y=point-bmpheight;y0;y-)for(x=0;xbmpwidth;x+)fread(&color,3,1,fp); /读取位图数据,三个字节表示一个像素点GFMSetPixels(color,x,y,1); /画点for(x=0;xbmprletype=0) /1555格式,GFMDrawRectangle(0,0,720,580, 0xff000000, 1);z=(4-(point-bmpwidth*2)%4)%4; /z为调整位图宽度的参数for(y=point-bmpheight;y0;y-)for(x=0;xbmpwidth;x+)fread(&color,2,1,fp);/读取位图数据final= (color&0X7c00)9)|(color&0X03e0)6)|(color&0X001f)3);/将位图数据转化为表示颜色的数GFMSetPixels(final,x,y,1);for(x=0;xz;x+)fread(&color,1,1,fp);/跳过多余的数据break;565模式和4444模式原理同上,只是在将位图数据转化为表示颜色的数时颜色掩码和移位有些不同。3) 压缩格式,以8位压缩为例:else /定义参数for(y=0;ybmpheight;)fread(&colornum,1,1,fp);/读取第一个相同颜色数的数据if(colornum=0)/判断若为0,联合第二个字节判断fread(&samecolor,1,1,fp);/读取第二个字节if(samecolor=0)/第二个字节为0,表示行结束else if(samecolor=1)/第二个字节为1,表示RLE编码图像结束break;else if(samecolor=2)/第二个字节为2,其后的两个字节表示下一个象素从当前开始的水平和垂直位置的偏移量else/若第二个字节大于2,则第二个字节表示其后有效的颜色数据if(samecolor%2!=0)fread(&pcolor,1,1,fp);else/若相同颜色数目不为零,后一字节表示颜色索引fread(&samecolor,1,1,fp);/读取颜色索引数据for(w=0;wbmpheight-y,1);/画点x+; break;4) 特效:for(z=point-bmpheight;z0;z-) /特效三:向上渐出(与特效一不太相同)GFMDrawRectangle(0,0,720,580, 0xff000000, 1);/不太稳定for(y=z;y0;y-)for(x=0;xbmpwidth;x+)fread(&color,4,1,fp);GFMSetPixels(color,x,y,1);rewind(fp);fread(point,sizeof(Filehead),1,fp);z为控制坐标位置的参数,控制y连续变化,实现图片的位置改变。但是显示是不太稳定,初步推断是创建画布的函数和画点函数有冲突。5) 宽度处理问题:以1位为例GFMDrawRectangle(0,0,720,580, 0xff000000, 1);z=(32-(point-bmpwidth)%32)%32;/z为调整位图宽度的参数fread(pal1,sizeof(pal1),1,fp);/读取1位的调色板数据for(y=0;ybmpheight;y+)for(x=0;xbmpwidth+z)/8;x+)fread(&color,1,1,fp);for(w=0;w(7-w)&0x01;/取读出的数据的一位final=pal1temp;/对应到调色板的一个颜色if(xbmpwidth+7-w)/8)/限定显示范围GFMSetPixels(final,8*x+w,point-bmpheight-y,1);break;如果不进行宽度处理以及显示范围问题,就会出现右边多出一条4. 程序的源代码关键的函数以上有说明,整体源代码见附件。5. 调试过程中出现的问题及相应解决办法1) 图像倒置错误原因:画图的原理没有理解清楚,一般是从图像的左下角开始往上画的,但我在开始编写时,让它从(0,0)开始,结果就出现图像倒置了。解决办法:让纵坐标参数y从位图高度开始向0递减,或将画点函数中的第二个参数改为位图高度y。2) 图像歪斜错误原因:图像的宽度处理有问题,可能会向左偏或向右偏。解决办法:添加一个调整位图数据宽度的参数z,让表示颜色数据量能被4整除,多余的跳过不显示。3) 颜色变异错误原因:将位图数据转化成表示像素颜色的数据工程中出错。解决办法:根据各个位图的颜色表示方式,设置相应的算法,将颜色数据转换出来,特别要注意压缩的算法。4) 图像重叠错误原因:在显示下一张图片之前没有重新创建画布。解决办法:每次现实之前调用一次GFMDrawRectangle(0,0,720,580, 0xff000000, 1);函数,达到清屏的目的。5) 右边多出一条错误原因:每行多画了一点,坐标的范围没有控制好。解决办法:调用画点函数之前,先判断横坐标x的只有没有超出图像的宽度,没有超出时才能画点(1位、4位、8位都是如此)。6) 其他:图像混乱,一片白板,无显示。原因很多,可能是数据读取的问题,或者是坐标范围有问题。解决办法:仔细检查每一步代码,逐个排查。7) 代码中出现的严重语法错误:不匹配,缺失一个大括号。为解决和避免这一问题,可以在UltraEdit里查看代码,检查是否缺失大括号。8) 特效一、二中都有多余的错误图像遗留问题,解决方法是修改代码变成特效三。9) 特效三中出现图像抖动的现象,目前没有解决,可能是创建画布的函数和画点函数之间执行时有冲突,老师提示说是画布画得太大,只需刷新一部分,后来我又改了一下,边缘不抖了,中间还是有一部分不稳定。6. 个人体会及建议1) 首先要对设计任务有深入地了解和熟悉,明确目标;2) 其次要仔细研究背景和原理知识,对整体有初步的把握;3) 然后在开始动手写程序之前,先要理清思路,做到胸有成竹;4) 不要一开始就参考别人的代码,因为可能会看不懂,也不知道怎样修改,这样就会阻碍了自己的思维,应该按照自己理解分析来编写,这样遇到问题也能清楚的知道自己的失误在哪里,便于代码的修改与优化;5) 先易后难,我先从32位开始编起,然后是24位,1位,4位未压缩和8位未压缩,接着是16位,最后是4位压缩和8位压缩;先实现简单的功能,对显示的方法和原理有进一步的掌握和理解,后面难度加大时可以参考前面的思路,再加上相应处理,这样循序渐进,逐步完善代码,实现所有的功能;6) 在编写代码时要有宏观的把握,虽然说现在的软件编程书都在强调函数模块化,功能模块化,但是我认为这样做的前提是现对整体有很好的把握,对每一部分及其联系都有明确的认识,否则如果一味强调模块化,则会显得思路杂乱、零散,不利于整体代码的运行,也不利于提高自己的分析能力和编程能力;7) 在完善和优化代码的过程中,可以参考一下别人的思路,集思广益,拓宽思路,乐于尝试新的方法,归纳和总结好的经验,以使自己的代码更加可靠;但是代码的移植性也并不是总是那么好,每个人编写的风格不同,可能某个函数运行的环境不相同,放到另外一个人的代码中可能就会出错,所以参考别人的代码只能是在理解和掌握别人的思路和方法的基础上,再整合自己的想法,在适应自己的程序环境的条件下进行的;8) 在查错的过程中,要认真检查程序的每一步进展,顺着自己的思路走一遍,看到底是哪一步出错,必要时还要复习一下原理知识,对某些数据的处理和条件的控制可能一开始的想法就是不完善的;如果万一自己检查不出来是什么错误,可以让别人帮忙检查一下问题,因为一个人的思维能力有限,可能会陷入思维定式,每个人看问题的角度也不尽相同,换一个方向思考,可能问题就能得到解决;再者,在与别人讨论时也许就能发现自己的漏洞;还有,错误也会带来一些启发,也许给解决其他问题带来新的思路;9) 要善于发现问题,有自己的想法,也要善于尝试,凭自己的思路来实现一些创新的东西,比如在实现特效(其实我做出来的特效也许并不能算是真正的特效,只是一些特殊的显示效果)从一开始在编写32位的显示代码时,就对画点函数及坐标控制参数都有仔细理解和研究,发现通过改变某些控制参数就能改变位图的位置和显示方式,在代码的编写过程中,也做过一些尝试,在查错的同时也进一步验证了这些想法,但是都没有去系统地实现,最后在解决了图像宽度调整问题,所有的图片都能正常显示之后,尝试了自己的“特效”想法,发现还是有一些问题,不是特别稳定,如果有机会,想向老师请

温馨提示

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

评论

0/150

提交评论