简介
RLE全称(run-length encoding),翻译为游程编码,又译行程长度编码,又称变动长度编码法(run coding),在控制论中对于二值图像而言是一种编码方法,对连续的黑、白像素数(游程)以不同的码字进行编码。游程编码是一种简单的非破坏性资料压缩法,其好处是加压缩和解压缩都非常快。其方法是计算连续出现的资料长度压缩之。
特点
------无损失压缩,既节省了磁盘空间又不损失任何图像数据。
------在打开这种压缩文件时,要花费更多时间,此外,一些兼容性不太好的应用程序可能会打不开。
-------RLE还有一个缺点,那要是内容像ABCABCABC的话使用这种算法文件会增大,就是1A1B1C1A1B1C1A1B1C了,更长,就达不到压缩的效果了。
简单的说RLE压缩就是将一串连续的相同数据转化为特定的格式达到压缩的目的。
代码实现
先用最简单思路,C语言实现
压缩算法代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> FILE *infile,*outfile; /*定义全局变量*/ void Compress(char *infilename,char *outfilename);/*压缩函数*/ void Common(char *filename);/*打开失败的提示*/ void main(int argc,char *argv[]) { printf("rleys compress file\n");/*输入提示*/ if(argc!=3) /*判断输入的参数格式是否正确*/ { printf("\n usage:rleys sourcefilename targetfilename\n"); exit(0);/*退出程序*/ } printf("\n compression ..."); Compress(argv[1],argv[2]);/*调用函数Compress()压缩数据*/ fclose(infile); /*关闭文件*/ fclose(outfile); } void Common(char *filename) { char tempspace[200]; strcpy(tempspace,"\nUnable to open ");/*将字符串复制到数组tempspace内*/ strcat(tempspace,filename);/*将字符串filename链接到字符串tempspace后面*/ puts(tempspace); exit(1); /*退出程序*/ } void Compress(char *infilename,char *outfilename)/*压缩文件*/ { register int seq_len; char cur_char,cur_seq; if((infile=fopen(infilename,"rb"))==NULL)/*判断文件是否打开成功*/ Common(infilename); if((outfile=fopen(outfilename,"wb"))==NULL)/*判断文件是否创建成功*/ Common(outfilename); cur_char=fgetc(infile); // 取得文件第一个字符 cur_seq=cur_char; // 将第一个字符赋值给seq seq_len=1; // 字符连续出现次数,长度初始化为1 while(!feof(infile)) /*进行压缩*/ { cur_char=fgetc(infile); // 取得文件的下一个字符 if(cur_char==cur_seq) // 文件上一个字符是否与当前字符相等 { seq_len++; // 相等则连续长度加一 } else { fputc(seq_len,outfile); fputc(cur_seq,outfile); // 不相等,则输出连续的长度和对应字符 cur_seq=cur_char; // 将不相等的第一个字符赋值给seq,开始下次长度计算 seq_len=1; // 长度归于一 } } }
解压算法实现,C语言
#include<stdio.h> #include<stdlib.h> #include<string.h> FILE *infile,*outfile; void Decompress(char *infilename,char *outfilename); // 解压函数 void Common(char *filename); // 打开失败的提示 void main(int argc,char *argv[]) { printf("rlejy decompress file\n"); //输入提示 if(argc!=3) // 判断输入的参数格式是否正确 { printf("\n usage:rlejy sourcefilename targetfilename\n"); exit(0); // 运行参数错误则退出程序 } printf("\n decompression ..."); Decompress(argv[1],argv[2]); // 调用函数Decompress()解压数据 fclose(infile); // 关闭文件 fclose(outfile); } void Common(char *filename) { char tempspace[200]; strcpy(tempspace,"Unable to open"); // 将字符串复制到数组tempspace内 strcat(tempspace,filename); // 将字符串filename链接到字符串tempspace后面 puts(tempspace); exit(1); // 退出程序 } void Decompress(char *infilename,char *outfilename) { register int seq_len,i; char cur_char; if((infile=fopen(infilename,"rb"))==NULL) // 判断文件是否打开成功 Common(infilename); if((outfile=fopen(outfilename,"wb"))==NULL) //判断文件是否创建成功 Common(outfilename); while(!feof(infile)) // 解压文件 { seq_len=fgetc(infile); // 读取的时候前面的字符是出现的次数 cur_char=fgetc(infile); // 后面的是对应的字符 for(i=0;i<seq_len;i++) { fputc(cur_char,outfile); // 按照压缩的规则依次“解压”:即是先读取该字符出现的次数,然后循环输出即可 } } }
运行结果如下:
压缩效果:
解压效果:
【未完待续】...这个只是最简单的实现...
作者:hu1020935219 发表于2013-11-21 23:34:42 原文链接
阅读:17 评论:0 查看评论