




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、绪 课题背 本文结 总体需 功能需 性能需 运行需 三、概要设 硬件架 功能框 设计思 四、详细设计与实 实现思 hypertrm工 功能设 解 Bmp格 bmp解析流程 bmp解析编码实 jpg格 jpg格式流程 Jpg格式解析编码实 五、测 六、结束 全文总 心得体 七、致 八、参考文 块之间的关系,还有介绍了比较的编码实现有缩放的技术、bmp格式的解析技术、还二、所以数码相册需要实现的是六个功能性的模块,浏览文件模块需要功能是能够浏览文件目录中的有的、文件和并且这些都是用图标来显示并且也可以显示它们的文件名;浏览像幻灯片一样放映选择连播模式时是那 下的和的时间间隔。以下是用户的用例图2-1由于我们使用的是c言来实现的显示和文字的显示在LCD的晶显示屏上这就需要一些图片编码、文字编码和字符编码的技术。综合来说要能够正常稳定的实现上面四个功能,我们对硬件方面和软件方面都有一定的要求。LCD和触摸屏的驱动了。mini2440LCD液晶屏,需要它用来展示、输出信息PCUSBPCPCwindowsxpfedora8.0,但是我们build出来的执行文件的运行的环境是以arm9为的mini2440的开发板上,所以我们需要配置环在虚拟机叉环境的搭建,需要配置环境参数arm-linux-gcc4.4.3puttyPCSecureCRTPC和虚拟机,PC如果需要我们应用程序能够正常的执行,正常的显示、文字、字符,那么我们需要一些库文件来提供解析、文字、字符的依据。typelibjpeg库,该库将JPEG格式的解析为RGB数据,最终将位图数据和的RGB数据复LCDLCD上显示出来。数码相册这个项目,我们的需求是,能够在LCD上显示,能够从触摸屏上得到输入信息能够根据输入信息一张一张的浏览,也可以自动的,可以对放大缩小移动。这些就是数码相册的主要的功能。linuxMINI2440MINI2440开发板上运行的代码,所以我们的硬件架构的概要设计就是虚拟机-PC机-MINI2440开发板。Mini2440实用的ARM9开发板,是目前国内性价比最高的一款学习板;它采用SamsungS3C2440为微处理器,并采用专业稳定的CPU内核电源和复位来保证系统运行时的稳定LCD液晶显示屏,触摸屏。3-1flashnandflashnorflash,我们知道nornand启动。Mini2440linuxlinux。Linux系统相对来说LinuxLinuxUNIXLinux采用页式管理支持动态库提供S命令解释程序和编程语言提供强大的管理功能,包括管理功能LinuxMini2440linuxlinux2.6.23yaffs,fat32,nfsled的驱动,LCD液晶屏的驱动,触摸屏的驱动,串口的驱动等,它上面有net,FTP,inetd网络登录工具及服务的应用程序。3-23-3Mini2440开发板开发的一种应用程序。与它相关的硬件有Mini2440开发板,PC机,还有一些外部通讯的硬件设备。在进行详细的编码设计之前我arm-linux-gcc4.4.3最后再到目标平台上去运行在一种平台上编译出能在另一种平台(体系结构不同)PC平台(X86CPU)上编译出能在armX86arm上才能运行,arm-linux-gcc。应用软件的环境有所不同,常采用宿主机目标机模式。它是交叉编译环境所需工具的集合体,是所需软件(binuntials、gccglibc等)的安装载体,4-1安装准备#mkdir/usr/local/arm#cparm-linux-gcc-4.4.3.tar.gz -C/usr/local/arm#tarxjvf exportPATH=#sourcehypertrmhypertrm是一款后可以直接使用的软件4-2数码相册是一个linux应用程序,应用程序中的函数是主函数,主函数中分别调用输入模4-3(一4-34-44-4层次模块图(二其能模块包括六个其功能分别是 “““ “ ,文件和,当点击相应的的时候可以进入到浏览模式。 ““ 0-59秒。浏览模块:当跳入到该模块那么切换的页面将会是一个用来浏览的页面,该页<-->的时候那么会将按90%的系数来缩放。当触碰“<-“->”时就表示显示上一张或者下一张。当触碰“连播模式”时那么就会切换到连播模式的页面,从当前开始。连播模块:该模块的能共就是像放映幻灯片一样,将一张一张一,以一定的时间间隔来显示出来,能跳到该页面的父页面是功能选择模块和浏览模块,在连播模式中是没有菜单的,它的功能就是简单动态的显示。57个文件,这么多文件我们需要将它们按其层次和功能分配放在不同的文件夹4-5debug的主要的功能用来输出显示的,其中封装了两种输出方式,一种是网络输出,一种是disy的主要的功能是使用LCD设备来显示需要显示的页面,这样我们才能够在MINI2440的LCD的屏幕上看得到按钮之类的,总的来说就是将各个像素的颜色值刷到指定的位置上,因此LCD液晶屏可以显示。encodingascii,utf8,utf-16be,utf-16le编码的判断和fontsincludeinput的主要功能是输入,其中有两种输入功能,一种是标准输入,一种是触摸屏输入,我pagerender中有两个文件夹一个是bmp格式和jpg格式的解析转化为颜色值的功能文件夹,另外一个是对的操作的文件夹,该文件中的主要功能是实现对的缩放功能,和合数码相册是一个linuxc编写的应用程序,所以其函数是主函数,在主函数中就是调用底层的相关接口进行对要使用到的功能进行初始化和之类的动作,然后再跳入到功能选择页面,等待触摸屏的输入。4-54-64-6mian主disp_manager.c、input_manager.c、pic_operation.c、picfmt_manager.c及其底层是由我负责,这些页面关系到的就是三个功能页面分别是联播页面、设置时间间隔页面和浏览页面。其中fb.c的主要的功能是使用LCD液晶显示屏来显示,touchscreen.c主要的功能是能够接受触摸屏的信息然后提交触摸,给上层处理。我主要处理的功能模块是联播模块,设置时间间隔模块和的浏览模块,这三个功能模块图4-7浏览模块流程图4-7是浏览模块的流程图,当切换到该页面是,就会调用该页面的ManualPageRun()函mian页面的话就切换到文件浏览页面,如果不是就继续完成浏览页面的显示,然后是一次得到缓冲描绘,然后显示出该页面,时刻关注触摸屏的输入,对输入进行处理。4-8IntervalPageRun()数,来进行页面的显示和输入的处理。该函数先得到显存用来显示数据,然后将数据全部刷到LCD上就会显示相应的数据了。4-84-9AutoPageRun()函数然,启用一个线程,专门用来处理显示下一张,同时需要监测触摸屏是否是输入发生,如果有就不在显示下一张了,而是返回到父函数,监测功能的是用一个互斥量来实现的。4-9在实现这三个功能模块时,需要进行一些技术上的处理,比如的编码解析、的缩放算法、合并。4.4解数码相册中很重要的一部分就是的显示,这就关系到编码的解析。数码相册这个项目式。对于bmp格式和jpg的格式处理是不一样的。其中解析jpg我们调用的是libjpeg首先文件,得到文件的信息,然后调用GetParser()函数判断得到支持该格式的结构体,然后调用该结构体的GetPixelDatas函数指针对进行解析。Bmp格
图4-10不同格式的解析流程位图(Bitmap)当然是最简单的,它是Windows显示的基本格式,其文件扩展名*.BMP。在Windows下,任何格式的文件都要转化为位图才能显示出来,各种格式的文件31Windows大小RGBtypedefstructtagBITMAPFILEHEADER{/*bmfh*/UINTbfType;DWORDbfSize;UINT UINTbfDWORD}typedefstructtagBITMAPINFOHEADER{/*bmih*/DWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbi WORDbiBitCount; DWORDLONGLONGDWORDDWORD}4.4.2bmp解析流程图4-11Bmp格式流程函数指针,该函数主要的作用是把bmp文件中的图像数据,取出并转换为能在显示设备上使用的格分别是用来文件头信息和文件位图信息的,ptPixelDatas指针变量是要返回给父函数的参数,ptFileMap是传递进来的参数,这个结构体中有信息,根据这个参数我们可以得到文件头信息和ptBITMAPFILEHEADERptBITMAPINFOHEADER两个指针变量。得到了文件的文件头信息和文件位图信息后可以知道是否是24位像素的如果不是的话BMP文件中一行的象素数据,4.4.3bmp解析编码实staticintGetPixelDatasFrmBMP(PT_FileMapptFileMap,PT_PixelDatas{/*这两个变量的类型是专门为BMP格式的格式定义的来解析该文件编码的*/BITMAPFILEHEADER*ptBITMAPFILEHEADER;BITMAPINFOHEADERunsignedchar*aFileHead;intiWidth;intiHeight;intiBMPBpp;inty;unsignedchar*pucSrc;unsignedchar/*444字节*/intintiLineWidthReal;*334对齐*/aFileHead=ptFileMap->pucFileMapMem;/*BMP分为三部分第一部分是 /*指向BMP文件的头ptBITMAPFILEHEADER=(BITMAPFILEHEADER/*指向BMP文件的位图信息头部iWidth=ptBITMAPINFOHEADER->biWidth;/*得到图像的宽度*/iHeightptBITMAPINFOHEADER->biHeight;/*得到图像的高度*//*/象素就是说一个像素用多少位来表示*/iBMPBpp=ptBITMAPINFOHEADER->biBitCount;if(iBMPBpp!= /*只处理是24位像素的BMP{DBG_PRINTF("iBMPBpp=%d\n",iBMPBpp);DBG_PRINTF("sizeof(BITMAPFILEHEADER)=%d\n",sizeof(BITMAPFILEHEADER));return-}/* =iWidth;/*得到的宽度和高度*/ptPixelDatas->iHeight=iHeight;ptPixelDatas->iLineBytes=iWidth*ptPixelDatas->iBpp/ =ptPixelDatas->iHeight*ptPixelDatas->iLineBytes;ptPixelDatas->aucPixelDatas=malloc(ptPixelDatas->iTotalBytes);/*if(NULL==ptPixelDatas-{return-}iLineWidthRealiWidth*iBMPBpp8;*7iLineWidthAlign=(iLineWidthReal+3)&~0x3;/*4取整这是一种向4取正的技巧*/pucSrc=aFileHead+ptBITMAPFILEHEADER->bfOffBits;/*指向BMP中颜色值得开始位置*/pucSrcpucSrc(iHeight1)*iLineWidthAlign;*指向颜色值得最后一行的位置pucDest=ptPixelDatas->aucPixelDatas;/*目的地 以后只要操作 的指针就好了/*ptPixelDatas->aucPixelDatas这个指针所指向的位置是不变的所以在获取该结构是不需要计算只要直接使用就好了*/for(y0;yiHeight;y++)/*一行一行的转化{/*转化一行转换的结构是在pucDest 中了但是pucDest CovertOneLine(iWidth,iBMPBpp,ptPixelDatas->iBpp,pucSrc,pucDest); iLineWidthAlign;/*pucDestptPixelDatas- }return}staticintCovertOneLine(intiWidth,intiSrcBpp,intiDstBpp,unsignedchar*pudSrcDatas,unsignedchar*pudDstDatas){/*如果目的的像素值也是24的话那就是目的和源都是一样的就只要一下就好了 if(iDstBpp==24){/*iWidth3个字节*/memcpy(pudDstDatas,pudSrcDatas,iWidth*3);}{for(i=0;i<iWidth;i++)/*处理一行的数 {/*0x00RRGGBB的格式的blue是在低位的所以是第一个*/ =pudSrcDatas[pos++];dwGreen= pudSrcDatas[pos++];/*第三个字节处*/if(iDstBpp==32) /*如果是32位的就只要每位占8字节 dwColor=(dwRed<<16)|(dwGreen<<8)|dwBlue;/*直接赋值因为 就是指向32位的数的不用强制转换什么的了*pwDstDatas32bpp=pwDstDatas32bpp++;/*32++32位为单位来加加}elseif(iDstBpp==16)/*16位的话就一般用565的格式来{/*565 =dwRed>>3;dwGreen=dwGreen>>2; =dwBlue>>3;dwColor=(dwRed<<11)|(dwGreen<<5)|*pwDstDatas16bpp=dwColor;}}}return}jpgJpg个是的解析是调用libjpeg库来进行解析的jpg格式流程如果是jpg格式的那么就进行处理就调用相应的T_PicFileParser结构体的GetPixelDatas函数指针,该函数主要的作用是把JPG文件中的图像数据,取出并转换为能在显示设备上使用的格式。该函数首先将文件定位在文件开头就是说文件信息是从文件头部开始,然后调用libjpeg库中的函数来处理,调用 press(&tDInfo)来初始化tDInfo变量,然后调用jpeg_stdio_src(&tDInfo,ptFileMap->tFp)获得文件一些信息放在tDInfo中,然后设置解压的参数tDInfo.scale_num和tDInfo.scale_denom然后进行解压调用 press(&tDInfo)启动解压,然后将解压得到的信息放到ptPixelDatas指针变量中返回给父函数使用,解压结束后就结束解压和销毁跟别调用press(&tDInfo)和 press(&tDInfo)函数,其中也会调用调用CovertOneLine()BMP文件中一行的象素数据,转换为能在显bmpCovertOneLine()函数的实现基本一样。图4-12Jpg格式解析流程Jpg格式解析编码实staticintGetPixelDatasFrmJPG(PT_FileMapptFileMap,PT_PixelDatas{ press_structtDInfo;intiRet;intunsignedchar*aucLineBuffer=NULL;unsignedchar*pucDest;T_MyErrorMgrtJerr;/*对文件进行定位定位在开头fseek(ptFileMap->tFp,0,//分配和初始化一 pression结构//tDInfo.err= 设置错误处理函数 = MyErrorExit;/*jpg/*Setjmp.h所做的事情就是异常处理,抛出异常,捕获异常,异常处理。0。*/{/*如果程序能运行到这里,表示JPEG出错press(&tDInfo);if{}if(ptPixelDatas-{}return-}press(&tDInfo);*初始化//jpeg_read_headerjpg信息jpeg_stdio_src(&tDInfo,ptFileMap->tFp);iRetjpeg_read_header(&tDInfo,//设置解压参数,tDInfo.scale_numtDInfo.scale_denom1;*1:1就是不缩小也不放大//启动解压: // =tDInfo.output_width;ptPixelDatas->iHeight=tDInfo.output_height; =ptPixelDatas->iWidth*ptPixelDatas->iBpp/8; =ptPixelDatas->iHeight*ptPixelDatas->iLineBytes;ptPixelDatas->aucPixelDatas=malloc(ptPixelDatas->iTotalBytes);if(NULL==ptPixelDatas-{return-}pucDest=ptPixelDatas-//jpeg_read_scanlineswhile(tDInfo.output_scanline</*得到一行数据,0xRR,0xGG0xBB*/(void)jpeg_read_scanlines(&tDInfo,&aucLineBuffer,1);//ptPixelDatasCovertOneLine(ptPixelDatas->iWidth,24,ptPixelDatas->iBpp,aucLineBuffer,pucDest);pucDest+=ptPixelDatas->iLineBytes;}return}4.5缩放算缩放功能中各个函数之间的流程图如下4-13当跳转到浏览的功能页面时,该页面上有“返回“缩小“放大“上一张“下一张“连图的90%来缩放。在ManualPageRun()函数中处理点击的数据,点击“缩小”或者“放大”时,那么计算出缩小或者放大的的大小,确定其中心点,然后调用GetZoomedPicPixelDatas()获得缩放后的部分信息,然后调用PicZoom()函数,该函数使用近邻取样插值算法使用传进来的参数来得到缩放后的颜色值,然后调用ShowZoomedPictureInLayout()函数来将缩放后的显示在manual页面中,而该函数主要是调用PicMergeRegion()函数来将合并到指定的区域中的。switch(iIndexPressed)case0:/*返回按钮return;**/}case1:/*缩小按 按下缩小按钮且停留在该按钮上的话 /*获得缩小后的数据iZoomedWidth=(float)g_tZoomedPicPixelDatas.iWidth*ZOOM_RATIO;iZoomedHeight=(float)g_tZoomedPicPixelDatas.iHeight*ZOOM_RATIO;iZoomedWidth,/*重新计算中心点*//*显示新数据*/ShowZoomedPictureInLayout(ptZoomedPicPixelDatas,ptDevMem);}进入case1之后调用GetZoomedPicPixelDatas()函数其主要的作用是获得缩放后的象素数据,之后调用ShowZoomedPictureInLayout()函数来将经过缩放的显示在manual的页面中的合适的staticPT_PixelDatasGetZoomedPicPixelDatas(PT_PixelDatasptOriginPicPixelDatas,intiZoomedWidth,intiZoomedHeight){ifg_tZoomedPicPixelDatas.aucPixelDatas*先判断释放内存可以有效的回收内存{g_tZoomedPicPixelDatas.aucPixelDatas=NULL;}PicZoom(ptOriginPicPixelDatas,/*由于g_tZoomedPicPixelDatas是全局变量所以可以这样回收内存*/return&g_tZoomedPicPixelDatas;/*返回得到的压缩的结构体*/}4-14的时候,要显示的会做出相应的相应,让按90%的系数缩小和放大。采用的缩放的算法是近邻取样插值算法。其原理介绍如下(1(0,0(D,DH)Dx-0是缩放后中随意一个坐标的width,DW-0是缩放后的widthSx-0是原的随意一个坐标的width,SW-0是原的widthDy-0是缩放后中随意一个坐标的height,DY-0是缩放后的heightSy-0是原中随意一个坐标的height,SY-0是原的height(Sy-0)/(SH-0)和(Dy-0)/(DH-0)的比值是一样的所以有如首先得出缩放后的的大小和缩放后的相对于(0,0)的坐标。点击缩放按钮后,将得到按原图的90%缩放后的的width和height,自然相对起点坐标就可以确定缩放后的各个坐可以得到相对于缩放后中某点在原图中的坐标值,然后将原图中该点的颜色值取出来保存到缩放后的的结构体中,然后返回给父函数。缩放函数的流程图如下:
4-15intPicZoom(PT_PixelDatasptOriginPic,PT_PixelDatas{unsignedlongdwDstWidth=ptZoomPic->iWidth;unsignedlong*pdwSrcXTable;unsignedlongx;unsignedlongy;unsignedlongdwSrcY;unsignedchar*pucDest;unsignedchar*pucSrc;unsignedlongdwPixelBytes=ptOriginPic-if(ptOriginPic->iBppptZoomPic->iBpp)*缩放前后的像素值不相等的话就返回错误{return-}pdwSrcXTablemalloc(sizeof(unsignedlong)*dwDstWidth);/*unsignedlong型*/if(NULL=={DBG_PRINTF("mallocerror!\n");return-1;}for(x0;xdwDstWidth;x++)//{/*通过缩放后的x值坐标还有知道缩放前后的宽度可以得到对应的原始的x值坐标*/}for(y=0;y<ptZoomPic->iHeight;{dwSrcY=(y*ptOriginPic->iHeight/ptZoomPic->iHeight);/*得到原始的相对的y值的坐标*/pucDest=ptZoomPic->aucPixelDatas+y*ptZoomPic->iLineBytes;/*得到一行的开始地址*/ =ptOriginPic->aucPixelDatas+dwSrcY*ptOriginPic->iLineBytes;for(x=0;x<dwDstWidth;{/*原图座标*缩放座标x,/*得到一行中的那一位然后把该位的像素值放到相应的位中*/memcpy(pucDest+x*dwPixelBytes,pucSrc+pdwSrcXTable[x]*dwPixelBytes,dwPixelBytes);}}return}编码完成后,进试。对浏览的功能、时间间隔设置功能、连播模块进行功能测试,采如下三张是功能测试的页
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025私营企业劳动合同管理规范
- 2025专业版小学教室的租赁合同样本
- 2025汽车销售合同格式范文
- 2025网络主播经纪合同范本
- 2025建筑陶瓷供应合同范本 建筑陶瓷供应合同模板
- 2025年上海市分体式空调安装与维护合同样本
- 《青少年财经素养教育》课件
- 《红楼梦绮梦》课件
- 杏色淡雅古风国潮时令节气端午节
- 2025年吉林货运从业资格考试题目及答案详解
- 树木清除合同协议
- 《中国脑卒中防治报告(2023)》
- 学生资助感恩教育主题班会
- 甘肃民族师范学院招聘工作人员考试真题2024
- 提高学生英语听力能力-英语教师的演讲
- 2025年湖北省八市高三(3月)联考英语试题(含答案和音频)
- 县域产业布局与升级-深度研究
- 第十六周《“粽”享多彩端午深耕文化传承》主题班会
- 日间患者流程护理质量改善项目汇报
- 创意美术网络安全课件
- 上海电信2025年度智慧城市合作协议2篇
评论
0/150
提交评论