多媒体数据压缩实验报告篇一:多媒体实验报告_文件压缩课程设计报告实验题目:文件压缩程序姓名:指导教师:学院:计算机学院专业:计算机科学与技术学号:提交报告时间:20年月日四川大学一,需求分析:有两种形式的重复存在于计算机数据中,文件压缩程序就是对这两种重复进行了压缩。
一种是短语形式的重复,即三个字节以上的重复,对于这种重复,压缩程序用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩。
第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。
给 256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。
编码式压缩必须在短语式压缩之后进行,因为编码式压缩后,原先八位二进制值的字节就被破坏了,这样文件中短语式重复的倾向也会被破坏(除非先进行解码)。
另外,短语式压缩后的结果:那些剩下的未被匹配的单、双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。
本程序设计只做了编码式压缩,采用Huffman编码进行压缩和解压缩。
Huffman编码是一种可变长编码方式,是二叉树的一种特殊转化形式。
编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。
根据 ascii 码文件中各 ascii 字符出现的频率情况创建 Huffman 树,再将各字符对应的哈夫曼编码写入文件中。
同时,亦可根据对应的哈夫曼树,将哈夫曼编码文件解压成字符文件.一、概要设计:压缩过程的实现:压缩过程的流程是清晰而简单的: 1. 创建 Huffman 树 2. 打开需压缩文件3. 将需压缩文件中的每个 ascii 码对应的 huffman 编码按 bit 单位输出生成压缩文件压缩结束。
其中,步骤 1和步骤 3是压缩过程的关键。
? 步骤1:这里所要做工作是得到 Huffman数中各叶子结点字符出现的频率并进行创建.统计字符出现的频率可以有很多方法:如每次创建前扫描被创建的文件,“实时”的生成各字符的出现频率;或者是创建前即做好统计.这里采用的是前一种方法。
? 步骤 3: 将需压缩文件中的每个 ascii 码对应的huffman 编码按 bit 单位输出. 这是本压缩程序中最关键的部分: 这里涉及“转换”和“输出”两个关键步骤:“转换”部分大可不必去通过遍历 Huffman 树来找到每个字符对应的哈夫曼编码,可以将每个 Huffman 码值及其对应的ascii 码存放于如下所示的结构体中:解压缩过程的实现:如果说,压缩的过程可以通过查找 codeList 来加速实现的话,而解压缩则必须通过查找 huffman 树才能加以实现.查找的过程是简单的,可以根据huffman 树的性质来做,当 haffCode的当前 bit 位为0 时,则向左枝展开搜索;当前bit 位为1时,则向右枝展开搜索,当遇到叶子结点时,则输出haffCode对应的asciiCode。
二、详细设计:核心算法源程序:Huffman树建立源程序://------------------------------------------------------------- //huffmantree.h //霍夫曼树#ifndef HUFFMANTREE #define HUFFMANTREE#define Defaultsize 300#include #include "bintree.h" #include "heap.h"class Code {public:int code; Code *link;Code(int c=0,Code *l=NULL):code(c),link(l){}; };class CharNameNode {public:unsigned char charname; //要这样才行 Code *link;CharNameNode(unsigned char c=0,Code *l=NULL):charname(c),link(l){}; };templateclass HuffmanTree:public BinaryTree {public:int key;HuffmanTree(){};HuffmanTree(HuffmanTree &ht1,HuffmanTree &ht2) {Type temp=0; //可能有变key=ht1.key+ht2.key;root= new BinTreeNode(0,Copy(ht1.root),Copy(ht2.root)); } void Build(int *fr,Type *value,int n,HuffmanTree &newtree);void Path(BinTreeNode *start,Code *first,Code *last,CharNameNode *Node,int &i); //一个数组};templatevoid HuffmanTree::Build(int *fr,Type *value,int n,HuffmanTree &newtree){//fr 为 value(值) 对应的权int i;HuffmanTree first,second;HuffmanTree Node[Defaultsize]; MinHeap > hp; assert(n>=0&&n Node[i].root=new BinTreeNode(value[i],NULL,NULL);Node[i].key=fr[i]; }hp=MinHeap >(Node,n); for(i=0;ihp.RemoveMin(first);hp.RemoveMin(second);HuffmanTree* temp=new HuffmanTree(first,second);hp.Insert(*temp); } hp.RemoveMin(newtree); }templatevoid HuffmanTree::Path(BinTreeNode *start,Code *first,Code *last,CharNameNode *Node,int &i) //一个数组 {if(start==NULL)return;//if(start->GetData()!=0) //是叶结点严重错误,可能叶结点也是0!!if(start->GetLeft()==NULL&&start->GetRight()==NULL) {Node[i].charname=start->GetData();Node[i].link=NULL;if(first==NULL) return;Node[i].link=new Code(first->code);Code *p=first->link,*q=Node[i].link;while(p!=NULL){ q->link=new Code(p->code); q=q->link; p=p->link;}q->link=NULL;i++;return; }Code *temp=new Code; //进入左子树 assert(temp);if(first==NULL)first=last=temp; else {last->link=temp;last=last->link; }Path(start->GetLeft(),first,last,Node,i);last->code=1;Path(start->GetRight(),first,last,Node,i); temp=first;if(first==last) {delete last;first=last=NULL;return; }while(temp->link!=last)temp=temp->link;temp->link=NULL; delete last; last=temp; }#endif实现二叉树的算法源程序://--------------------------------------------------------------------- //bintree.h//用指针实现的二叉树//Type 类型必须有重载>及=运算#ifndef BINTREE #define BINTREE#include #includeint Max(int a,int b) {return a>b?a:b; }template class BinaryTree;templatee> class BinTreeNode {friend class BinaryTree; public:BinTreeNode():leftchild(NULL),rightchild(NULL){};BinTreeNode(Type item,BinTreeNode *left = NULL,BinTreeNode *right=NULL):data(item),leftchild(left),rightchild(right){}; Type GetData()const { return data; }BinTreeNode *GetLeft()const { return leftchild; } BinTreeNode *GetRight()const { return rightchild; } void SetData(const Type &item){ data=item; }void SetLeft(BinTreeNode *L){ leftchild = L; }void SetRight(BinTreeNode *R){ rightchild = R; } private:BinTreeNode *leftchild, *rightchild; Type data; 篇二:多媒体实验报告二图片的压缩处理计算机科学与技术学院XX-XX学年第1学期《多媒体技术》实验二:图像压缩算法实现专业:学号:姓名:教师:完成日期:多媒体技术实验二实验报告(一)实验目的1.理解有损压缩和无损压缩的概念;2.理解图像压缩的主要原则和目的;3.了解几种常用的图像压缩编码方式;4.利用MATLAB程序进行图像压缩;(二)实验环境1.高档微机:MPC2.课前准备:标准实验纸张若干张3.操作系统:Windows XX 或Windows XP 中文版4.编程工具:Matlab7.0(三)实验过程及结果实验原理:1.图像压缩原理图像压缩主要目的是为了节省存储空间,增加传输速度。