收藏 分销(赏)

数字图像处理在DSP上的实现(缩小)-2.doc

上传人:快乐****生活 文档编号:2579539 上传时间:2024-06-01 格式:DOC 页数:28 大小:579.04KB
下载 相关 举报
数字图像处理在DSP上的实现(缩小)-2.doc_第1页
第1页 / 共28页
数字图像处理在DSP上的实现(缩小)-2.doc_第2页
第2页 / 共28页
数字图像处理在DSP上的实现(缩小)-2.doc_第3页
第3页 / 共28页
数字图像处理在DSP上的实现(缩小)-2.doc_第4页
第4页 / 共28页
数字图像处理在DSP上的实现(缩小)-2.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、数字图像处理在DSP上的实现(缩小) 2 作者: 日期:2 个人收集整理 勿做商业用途课程设计任务书学 院信息科学与工程专 业电子信息工程学生姓名班级学号课程设计题目数字图像处理在DSP上的实现(缩小)课程设计目的与要求:技术要求:1。 能从计算机上读取图片 2. 编写程序,在TMS320C5509上实现 工作计划与进度安排:2012年 12月31日 选题目查阅资料2013年 01月04日 查阅资料2013年 01月05日 - 2013年 01月 09日 上机调试2013年 01月10日 撰写课程设计报告、答辩指导教师: 年 月 日专业负责人:年 月 日学院教学副院长:年 月 日成绩评定表学生

2、姓名班级学号专 业电子信息工程课程设计题目数字图像处理在DSP上的实现缩小评语组长签字:成绩日期 年 月 日摘 要以TMS32C5501为例,介绍了其系列DSP(digital signal processing)芯片HPI(host port interface)口的各个组成部分及其功能,并以AT89C51单片机作为主处理机,阐述了与TMS320C5501之间实现数据共享的方法,成功地解决了主处理机通过HPI接口对DSP内部数据进行在线修改和实时监控的问题.最后给出了如何用HPI口实现程序的加载引导,以提高程序运行速度的方法。关键词:TMS320C5501,DSP, HPI口;目 录绪 论1

3、1、基本原理21.1 数字图像处理常用方法21.2 数字图像处理的优点31.3 数字图像缩小基本原理42、 TMS320C5X的硬件结构52。1 C55X的CPU体系结构52.2 指令缓冲单元(I)52.3 指令缓冲单元(P)52.4 指令缓冲单元(A)62.5 指令缓冲单元(D)63、数字图像缩小设计方法83。1 设计思路83。2 实验步骤84、数字图像缩小的CCS实现104.1 简述CCS环境104.1。1 CCS主要特点104。1.1 DSP/BIOS和API函数以及RTDX插件94。2 CCS配置104.3 CCS环境中工程文件的使用104。3。1 建立工程文件104.3。2 创建新文

4、件134。3.3 向工程项目中添加文件134.4编译链接和运行目标文件144。4.1对程序进行编译链接144。4。2装载OUT文件145、运行结果15结 论15附录 程序清单23参考文献24II1、课题分析DSP作为一种先进的可编程处理器,近几年来应用极其广泛。其中,TMS320C55X是TI公司推出的定点系列数字信号处理芯片,它具有运算速度高、CPU结构优化、功耗低和智能化外设等特点,特别适用于实时嵌入式系统的开发。它已成为数字产品设计中低成本、低功耗、高性能的数字信号处理芯片的首选,在便携式仪器、消费类电子、医疗设备等领域得到广泛的应用。但我们在学习中发现TMS320C55X系列芯片存在2

5、个应用问题:DSP应用系统一旦开发完成投入使用后,再想对DSP内的数据进行监控,或者在线修改很不方便,不管是接串口,还是接IO口都要占用DSP的硬件资源,同时软件的开销也非常大。在DSP 扩展程序数据存储器时,FLASH 因其烧写方便而较为常用,但这类器件数据存取速度慢,难以满足DSP系统高速运行的要求.这也是限制TMS320C55X广泛应用的一个因素。此外,TI的TMS320C55系列DSP芯片内部提供了标准的8位HPI主机接口,用来与主设备或者主处理器接口,在通过HPI口和主机通信的过程中,完全没有硬件和软件的开销,而由DSP自身的硬件协调冲突,从而不会打断DSP正常程序的运行,且利用HP

6、I口,还能成功地进行程序加载引导。文档为个人收集整理,来源于网络文档为个人收集整理,来源于网络传感器采集到的模拟信号经过滤波放大后,由模/ 数转换器转换成相应的数字信号, 再由DSP( TMS320C55x) 进行数字信号处理,将处理后的数据通HPI(主机接口) 传送到单片机89S51中,单片机内嵌入TCP/ IP 协议,它主要负责数据的远程通信,完成网络数据的拆包与主机接口数据的打包。单片机通过并行接口与以太网控制器连接,以中断方式实现并行通信。以太网控制器接收到网络传输到的数据后,通过MAC比较、CRC 校验后,存到接收缓冲区;收满一帧后,以中断方式通知单片机。单片机对接收到的数据进行判断

7、,如果是UDP数据包,则检查IP地址和端口号,如果正确则接收数据包,并解包,然后将数据部分发送至DSP.反之,如果接收到DSP发送来的数据,则将数据按照UDP协议格式打包,然后送到以太网控制器中的发送缓冲区,传输到网络上。TMS320C55x系列DSP与PC机通信的方式有两种:一种是利用DSP的主机接口HPI与PC并行口连接,由软件来设定通信波特率和握手方式。另一种方式是通过专用的异步通信芯片来实现,它可以实现DSP与PC机的高速数据通信.本次设计主要采用第一种方式来实现.1、基本原理1.1 数字图像处理常用方法1。 图像取样和量化一幅图像的x和y坐标及幅度可能都是连续的。为了把它转换成数字形

8、式,必须在坐标和幅度上都做取样操作。数字化坐标值称为取样,数字化幅度值称为量化。2. 图像增强和复原图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响.图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型,再采用某种滤波方法,恢复或重建原来的图像.3。 彩色图像处理彩色图像处理已经成为一个重要领域,因为基于互联网的图像处理应用在不断增长.彩色图像处理可分为两个主要领域:全彩色处理和伪彩色处理。在第一类中,

9、图像用全彩色传感器获取,如彩色电视摄像机或彩色扫描仪.在第二类中,对特定的单一亮度或亮度范围赋予一种颜色。到目前为止,数字彩色图像处理多为伪彩色处理。4。 图像编码压缩图像编码压缩技术可尽量减少描述图像的数据量,以便节省图像传输、处理时间和减少所占用的存储器容量。这一过程实际上就是将二维像素阵列变换为一个在统计上无关联的数据集合。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。5. 图像分割图像分割是数字图像处理中的关键技术之一。分割将图像细分为构成它的子区域或对象。分割的程度取决于要解决的问题。图像分割是

10、将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础.对图像分割的研究还在不断深入之中,是目前图像处理中研究的一个热点.6. 图像描述图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。1.2 数字图像处理的优点1。 再现性好 数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存

11、储、传输或复制等一系列变换操作而导致图像质量的退化.只要图像在数字化时准确地表现了原稿,则数字图像处理过程始终能保持图像的再现. 2处理精度高 按目前的技术,几乎可将一幅模拟图像数字化为任意大小的二维数组,这主要取决于图像数字化设备的能力。现代扫描仪可以把每个像素的灰度等级量化为16位甚至更高,这意味着图像的数字化精度可以达到满足任一应用需求。对计算机而言,不论数组大小,也不论每个像素的位数多少,其处理程序几乎是一样的.换言之,从原理上讲不论图像的精度有多高,处理总是能实现的,只要在处理时改变程序中的数组参数就可以了。回想一下图像的模拟处理,为了要把处理精度提高一个数量级,就要大幅度地改进处理

12、装置,这在经济上是极不合算的。3适用面宽 图像可以来自多种信息源,它们可以是可见光图像,也可以是不可见的波谱图像(例如X射线图像、 射线图像、超声波图像或红外图像等)。从图像反映的客观实体尺度看,可以小到电子显微镜图像,大到航空照片、遥感图像甚至天文望远镜图像。这些来自不同信息源的图像只要被变换为数字编码形式后,均是用二维数组表示的灰度图像(彩色图像也是由灰度图像组合成的,例如RGB图像由红、绿、蓝三个灰度图像组合而成)组合而成,因而均可用计算机来处理.即只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处理方法适用于任何一种图像。 4灵活性高 图像处理大体上可分为图像的像质改善

13、、图像分析和图像重建三大部分,每一部分均包含丰富的内容。由于图像的光学处理从原理上讲只能进行线性运算,这极大地限制了光学图像处理能实现的目标。而数字图像处理不仅能完成线性运算,而且能实现非线性处理,即凡是可以用数学公式或逻辑关系来表达的一切运算均可用数字图像处理实现.1.3 数字图像缩小基本原理在计算机图像处理中图像缩放image scaling是指对数字图像的大小进行调整的过程。图像缩放是一种非平凡的过程需要在处理效率以及结果的平滑度smoothness和清晰度sharpness上做一个权衡.当一个图像的大小增加之后组成图像的像素的可见度将会变得更高从而使得图像表现得“软”.相反地缩小一个图

14、像将会增强它的平滑度和清晰度。 压缩卡的图像采集是由TMS320C5509直接完成的.初始化结束后TMS320C5509按缺省模式或主机命令的要求确定图像的大小和采集速率等参数然后根据奇、偶场信号和复合同步脉冲信号来采集图像数据。 采集流程可分为以下几个步骤 等待场开始。 当场开始信号到来时TMS320C5509进入场处理子程序开放行中断做好采集一场数据的准备。根据奇、偶场信号可以决定是采集奇场图像还是采集偶场图像。 当重复同步信号到来时TMS320C5509进入中断服务子程序并将图像数据存入扩展的数据存储器中.当一场或一帧图像各行数据都采集完毕后关闭中断。 基于TMS320C5509的黑白图

15、像采集之缩放实现中DSP接收到场开始信号后进入场处理子程序中。在场处理子程序中先确定将要采集的图像的大小并设置采集、编码及发送过程中要使用的参数然后打开行采集中断INT0延时一定数目的行周期后退出场处理子程序进入图像采集阶段。采集中断要完成图像采集和其它一些任务.在每行图像采集之间应根据图像大小延时一段时间以保证采集到的图像位于画面的中心。采集图像时每隔140ns读取一个A/D转换数据存入帧缓冲器。由于读取A/D转换结果与写帧缓冲器只用了80ns因此可以先将图像数据减去128再存入帧存储器这样就进行了JPEG编码时就不要执行减128操作了节约了时间. 2、TMS320C5X的硬件结构2。1 C

16、55X的CPU体系结构C55X有1条32位的程序数据总线(PB),5条16位数据总线(BB、CB、DB、EB、FB)和1条24位的程序地址总线及5条23位地址总线,这些总线分别与CPU相连。总线通过存储单元接口(M)与外部程序总线和数据总线相连,实现CPU对外部存储器的访问.这种并行的多总线结构,使CPU能在一个CPU周期内完成1次32位程序代码读、3次16位数据读和两次16位数据写。C55X根据功能的不同将CPU分为4个单元,指令缓冲单元(I)、程序流程单元(P)、地址流程单元(A)、和数据计算单元(D)。读程序地址总线(PDA)上传送24位的程序代码地址,由读程序总线(PB)将32位的程序

17、代码送入指令缓冲单元进行译码1.2。2 指令缓冲单元(I)C55X的指令缓冲单元有指令缓冲队列IBQ和指令译码器组成。在每个CPU周期内,I单元将从程序数据接收的4B程序代码放入指令缓冲队列,指令译码器从队列中取6B程序代码,根据指令的长度可对8位、16位、24位、32位和48位的变长指令进行译码,然后把译码数据送入P单元、A单元和D单元去执行.2。3 程序流程单元(P)程序流程单元有程序地址产生电路和寄存器组凑成.程序流程单元产生所有程序空间的地址,并控制指令的读取顺序。程序地址产生逻辑电路的任务是产生读取空间的24位地址。一般情况下,它产生的是连续地址,如果指令要求读取非连续地址的程序代码

18、时,程序地址产生逻辑电路能够接收来自I单元的立即数和来自D单元的寄存器值,并将产生的地址传送到PAB。在P单元中使用的寄存器分为5种类型。l 程序流寄存器:包括程序计数器、返回地址寄存器和控制流程关系寄存器.l 块重复寄存器:包括块重复寄存器0和1(BRC0、BRC1)BRC1的保存寄存器(BRS1)、块重复起始地址寄存器0和1以及块重复结束地址寄存器0和1。l 单重复寄存器:包括单重复寄存器和计算单重复寄存器。l 中断寄存器:包括中断标志寄存器0和1、中断使能寄存器0和1以及调试中断使能寄存器0和1.l 状态奇存期:包括状态寄存器0,1,2和3。2.4 地址程序单元(A)地址程序单元包括数据

19、地址产生电路、算术逻辑电路和寄存器组构成。数据地址产生电路能够接收来自I单元的立即数和来自A单元的寄存器产生读取数据空间的地址.对于使用间接寻址模式的指令,有P单元向DAGEN说明采用的寻址模式。A单元包括一个16位的算术逻辑单元,它既可以接收来自I单元的立即数也可以与存储器、I/O空间、A单元寄存器、D单元寄存器和P单元寄存器进行双向通信.A单元包括的寄存器有以下几种类型。l 数据页寄存器:包括数据页寄存器和接口数据页寄存器;l 指针:包括系数数据指针寄存器、堆栈针寄存器和8个辅助寄存器;l 循环缓冲寄存器:包括循环缓冲大小寄存器、循环缓冲起始地址寄存器;l 临时寄存器:包括临时寄存器。2。

20、5 数据计算单元(D)数据计算单元由移位器、算数逻辑电路、乘法累加器和寄存器组构成.D单元包含了CPU的主要运算部件。D单元移位器能够接收来自I单元的立即数,能够与存储器、I/O单元、A单元寄存器、D单元寄存器和P单元寄存器进行双向通信,此外,还可以向D单元的ALU和A单元的ALU提供移位后的数据。移位可以完成以下操作:l 对40位的累加器可以完成向左最多32位的移位操作,移位数乐意从零食寄存器读取或由指令中的常数提供;l 对于16位寄存器、存储器或I/对于16位立即数可完成向左移最多15位的移位操作。3、数字图像缩小设计方法3。1 设计思路图像可以看作由无数点像素组成这些点与x轴的每一个角度

21、值相对应可以利用DSP处理器处理大量重复计算的优势来计算x轴每一点对应的y的值(在x轴取N个点进行逼近)。3。3 实验步骤 1. 实验准备:设置软件仿真模式,启动CCS。2. 新建工程,将相应程序代码添加到工程中。3. 编译并检查程序是否有错误,直到无错误为止,添加。out文件.4. 打开工程“Image.pjt”中的C语言程序“Image.c”,在程序中有“BreakPoint”注释的语句上加软件断点。图3.1 设置原图像观察窗口图3。2 设置取反后的图像观察窗口5. 运行程序。按“F5”键运行到各个断点,观察图像和缩小结果。6. 实验完成,推出CCS。4、数字图像缩小的CCS实现4。1 简

22、述CCS环境 CCS,即Code Composer Studio,是TI公司在1999年推出的一个开放、具有强大集成开发环境.它最初是由GO DSP公司为TI的C6000系列DSP开发的。在TI收购了GO DSP后,将CCS扩展到了其它系列。现在所有TI的DSP都可以使用CCS进行开发,但是其中的DSPBIOS功能只有C5000和C6000的CCS中才提供。 以前的DSP软件开发都是在一个分散的开发环境下进行,程序的编写、代码的生成以及调试等都是要通过命令来完成,类似于以前的DOS,十分烦杂.而CCS的出现是DSP开发软件的一次革命性的变化。CCS主要由代码生成工具、CCS集成开发环境、DSP

23、BIOS和API函数以及RTDX组成.4。1.1 CCS主要特点集成可视化代码编辑界面,可以方便地直接编写C、汇编、.h文件、。cmd文件等。集成代码生成工具,包括汇编器、优化的C编译器和连接器等。具有完整的基本调试工具,可以载入执行文件(。out),查看寄存器窗口、存储器窗口和变量窗口、反汇编窗口等,支持在C源代码级进行调试.支持多片DSP联合调试。断点工具,支持硬件断点、数据空间读/写断点、条件断点等.探针工具,用于进行算法仿真,数据监视等。剖析工具,用于评估代码执行的时间。数据图形显示工具,可绘制时域/频域波形、眼图、星座图等,并可以自动刷新.提供GEI工具,用户可以根据需要编写自己的控

24、制面板/菜单,从而方便直观地修改变量,配置参数。4。1。2 DSP/BIOS和API函数以及RTDX插件DSP/BIOS(Basic Input Output System)和API(Application Program Interface)函数为CCS的主要插件之一.DSPBIOS可以看作是一个准实时操作系统,支持TI DSP芯片的各种实时操作系统都是以DSP/BIOS作为底层软件,为嵌入式应用提供基本的运行服务。并且,它还能实时获取目标机的信息,并将其传递给主机上的BIOSCOPE工具,对应用程序进行实时分析RTDX (Real Time Data Exchange)插件是CCS中另一个

25、十分重要的插件。实时数据交换技术为CCS提供了一个实时、连续的可视环境,开发人员可以看到DSP应用程序工作的真实过程。RTDX允许系统开发者在不停止运行目标应用程序的情况下在计算机和DSP芯片之间传输数据,同时还可以在主机上利用对象链接嵌入(OLE)技术分析和观察数据。RTDX可以在DSPBIOS中使用,也可以脱离DSP/BIOS使用。由于CCS中的Simulator不支持RTDX,所以必须在连接有硬件仿真器或目标板的Emulator下使用.4。2 CCS配置击桌面图标的“setup CCStudio v3.1”图标,运行CCS设置程序,如图5.1所示:点击AddSave&quit完成设置。图

26、4.1 用标准配置文件设置系统配置4。3 CCS环境中工程文件的使用4.3。1 建立工程文件在CCS集成环境下开发汇编程序或者C/C+程序,首先要建立一个工程项目文件(。pjt),再向工程项目文件中添加汇编程序源文件(*.asm),C/C+源文件(*。c)和链接命令文件(.cmd),并设置工程项目选项.使用CCS开发应用程序的一般步骤如下:l 创建或打开一个工程项目文件(.pjt),编辑各类文件,可以使用CCS提供的集成编辑环境,对链接命令文件和源程序进行编辑。l 对工程项目进行编译。在编译过程中如果出现语法错误,将在编译链接信息视窗(build)窗口中显示错误信息,用户可以根据显示的信息找到

27、错误的位置,更改错误。l 对结果和数据进行分析和算法评估.用户可以利用CCS提供的探测点。图形显示和性能评价等工具,对运行结果及输出数据进行分析,评估算法的可能性. 下面分别进行介绍建立工程文件,单击ProjectNew命令,系统将弹出如图所示的对话框,在该对话框中输入项目文件名,如fir单击“完成”系统就会创建一个名为fir。pjt的工程项目文件如图5。2所示。图4.2 创建新的工程项目文件对话框4.3.2 创建新文件选择FileNew可打开一个新的编辑窗口。在新窗口中输入源代码。选择FileSave,在出现的对话框中输入一个文件名,并选择一个扩展名(C源代码选择。c,汇编源代码选择.asm

28、),然后单击保存将源程序保存6。4。3.3 向工程项目中添加文件添加文件:单击ProjectAdd File to Project命令然后会弹出如图5.3所示的对话框,单击打开完成对文件的添加。图4。3 向工程项目中添加文件对话框4.4 编译链接和运行目标文件4.4。1 对程序进行编译链接对程序进行编译:执行ProjectCompile命令就可以对当前的汇编程序进行编译生成.obj文件。如果程序存在语法错误,那么就会在下面的编译链接信息框中显示错误信息。根据错误提示,读者可对程序进行修改2。对程序进行编译链接执行ProjectBuild命令,就可以对当前的项目文件同时进行编译,汇编和链接操作,

29、并生成与工程项目名称相同的可执行的。out文件。如果有错误信息,则会在“编译链接信息框中显示。也可以执行Project下的build All命令,所有项目中的文件重新编译,汇编和链接,生成。out文件.4.4。2 装载。out文件单击主菜单“File”中“Load Program”选项,在对话框中,在CCS安装目录下,找到构建该工程的Debug目录,选择构建生成后的。out文件,并打开CCS装载完毕后,该“。out”文件到目标dsp之后,会自动弹出“Disassembly”窗口如图5。4所示。图4。4 CCS调试程序时出现的视窗加工程界面5、运行结果在主菜单中选择DebugAnimate命令或

30、按Alt+F5键运行程序。数字图像取反的仿真结果如图所示: 缩放前后的图像 6、结束语 经过四周的摸索以及老师同学的帮助经过对课程设计的多次修改我终于顺利按时完成了本次课程设计任务.在这次课程设计中我遇到了一些课堂中从未遇到的问题通过网络查找和同学交流大大促进了设计进程。并在过程中进一步提高了自身的创作、创新水平扎实基础扩展所学。这次课程设计不仅让我更加深刻的了解了黑白图像采集之缩放实现的原理也更加深刻理解了它在通信系统中的重要作用。 在整个设计过程中对我来说收获最大的是那些分析和解决问题的方法与能力。从分析任务书到如何找到设计原理以及采用什么平台来实现原理都是环环相扣的一个过程哪一个步骤出现

31、了问题都会给最终的设计带来麻烦。我的理论知识和实际应用脱节它需要我将学过的相关知识都系统地联系起来对学过的理论进行深入的理解这就为我们以后进行社会生产打下了基础。通过本次课程设计我真切的体会到了理论与实际工程的联系架起这座桥梁的就是我们的系统仿真。也正是因为有了系统仿真这个模块才让我们的理论在不至于和实际工程相差很远也让我们在学校里就可以验证理论知识说到这里我不得不感到电子世界的奇妙.对于我们在校大学生来说很难遇到很好的机会可以把理论运用到真正的实际工程中去因为我们没有经验也因为实际工程的严谨不存在尝试的可能性不允许有任何差错。要完整的做好一个设计需要的不仅是懂得理论就可以了。 回顾这次课程设

32、计感慨颇多在短短的四周时间里我不仅巩固了以前学过的知识还学到了很多新知识。这次课程设计使我深刻认识到理论和实践相结合是很重要的只有理论知识是远远不够的只有把理论和实践结合起来从实践中得出结论才是真正自己掌握好的知识才能提高自己的实际动手能力和独立思考解决问题的能力。同时完成课程设计的过程中我也发现了自己的很多不足。比如有时候自己遇到问题做不出来就开始浮躁。通过此次课程设计我知道了做科学需要严谨的态度和广褒的知识为我以后更好的学习指明了一个努力的方向。我会不断的努力学习珍惜每次机会把专业学好锻炼自己独立思考问题的能力同时培养自己理论联系实际及动手的能力. 最后这个设计之所以能按时完成离不开老师的

33、指导和同学的帮助在此对他们表示衷心的感谢也感谢学校给了我这次锻炼自己和认识自己知识水平的好机会. 附录 程序清单#include windows。hinclude stdio.hdefine FXZOOMRATIO 0.5/x轴放大倍数define FYZOOMRATIO 0.5 /y轴放大倍数unsigned char pBmpBuf; /读入图像数据的指针unsigned char *pNewBmpBuf;int bmpWidth;/图像的宽int bmpHeight;/图像的高RGBQUAD *pColorTable;/颜色表指针int biBitCount;/图像类型,每像素位数lon

34、g newBmpWidth;/变化后图像的宽long newBmpHeight;/变化后图像的高long newLineByte; /变化后图像数据每行的字节数/*函数名称:readBmp()*函数参数:const char bmpName 读入bmp格式文件的名称及路径函数返回值:为失败1为成功函数描述:给定文件的名称和路径读入图像的位图数据,宽,高,及每个像素的位数进内存,保存在全局变量中*/bool readBmp(const char* bmpName)FILE fp=fopen(bmpName,”rb);if(fp=0)printf(”cannot open file);return

35、 0;fseek(fp,sizeof(BITMAPFILEHEADER),0);BITMAPINFOHEADER head;fread(head,sizeof(BITMAPINFOHEADER),1,fp);bmpWidth = head。biWidth;bmpHeight = head。biHeight;biBitCount = head.biBitCount;int lineByte = (bmpWidth *biBitCount/8+3)/44;/计算图像每行像素所占的字节数if(biBitCount = 8) pColorTable = new RGBQUAD256; fread(pC

36、olorTable,sizeof(RGBQUAD),256,fp);pBmpBuf = new unsigned char lineByte bmpHeight;fread(pBmpBuf,1,lineByte bmpHeight,fp);fclose(fp);return 1;/*函数名称:saveBmp()*函数参数:const char *bmpName 写入bmp格式文件的名称及路径 unsigned char imgBuf 待存盘的位图数据 int width, 以像素为单位待存盘的位图宽 int height, 以像素为单位待存盘的位图高 int biBitCount, 每个像素占

37、的位数 RGBQUAD *pColorTable 颜色表指针函数返回值:为失败1为成功函数描述:给定写入bmp文件的名称和路径要写入图像的位图数据,宽,高,写进文件中*/ bool saveBmp(const char* bmpName,unsigned char imgBuf,int width,int height,int biBitCount,RGBQUAD pColorTable)if(!imgBuf)/imgBuf 待存盘的位图数据 return 0;int colorTablesize = 0;if(biBitCount = 8) colorTablesize =1024;int

38、lineByte = (width * biBitCount/8+3)/4*4;FILE fp = fopen(bmpName,”wb);if(fp = 0) return 0;BITMAPFILEHEADER fileHead;fileHead。bfType= 0x4d42;fileHead。bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte height;fileHead.bfReserved1 = 0;fileHead。bfReserved2 = 0;fileHead

39、。bfOffBits = 54 +colorTablesize;fwrite(fileHead,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER head;head。biBitCount = biBitCount;head。biClrImportant = 0;head.biClrUsed = 0;head。biCompression = 0;head。biHeight = height;head。biPlanes =1;head.biSize = 40;head.biSizeImage = lineByte height;head.biWidth

40、 = width;head.biXPelsPerMeter = 0;head。biYPelsPerMeter = 0;fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);if(biBitCount = 8) fwrite(pColorTable,sizeof(RGBQUAD),256,fp);fwrite(imgBuf,height * lineByte,1,fp);fclose(fp);return 1;/*函数名称:bmpzoom()函数参数:const char* szSrcBmp 原bmp图片的名称和路径 const char* szDstBmp 变

41、化后保存bmp图片后的文件路径函数返回值:0为失败1为成功函数描述:传入图片变化比例系数参数FXZOOMRATIO和FYZOOMRATIO 实现图片放大缩小*/bool bmpzoom(const char* szSrcBmp, const char* szDstBmp)readBmp(szSrcBmp);newBmpWidth = (long) (bmpWidth FXZOOMRATIO) +0.5);newBmpHeight = (long) (bmpHeight FYZOOMRATIO +0。5);newLineByte = (newBmpWidth * biBitCount/8+3)/

42、44;pNewBmpBuf = new unsigned char newLineByte newBmpHeight;/printf(width = %d, height = %d,biBitCount = %dn”,bmpWidth,bmpHeight,biBitCount);/printf(newwidth = %d, newheight = d,biBitCount = dn”,newBmpWidth,newBmpHeight,biBitCount); long i,j,k;long i0,j0;int lineByte =(bmpWidth*biBitCount/8+3)/44;if(

43、biBitCount=8) for(i = 0;i bmpHeight/2;i+) for(j = 0;jbmpWidth/2;j+) (pBmpBuf+i*lineByte+j) = 0; if(biBitCount = 24) for(i = 0;i newBmpHeight;i+) for(j = 0; jnewBmpWidth;j+) for(k=0;k3;k+) i0 = (long)(i/FYZOOMRATIO+0.5); j0 = (long)(j/FXZOOMRATIO+0.5); if(j0 =0) & (j0 bmpWidth) (i0 =0) (i0 bmpHeight)

展开阅读全文
相似文档                                   自信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 

客服