RLE全称(run-length encoding),翻译为游程编码,又译行程长度编码,又称变动长度编码法(run coding),在控制论中对于二值图像而言是一种编码方法,对连续的黑、白像素数(游程)以不同的码字进行编码。游程编码是一种简单的非破坏性资料压缩法,其好处是加压缩和解压缩都非常快。其方法是计算连续出现的资料长度压缩之。
#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; // 长度归于一 } } }
#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); // 按照压缩的规则依次“解压”:即是先读取该字符出现的次数,然后循环输出即可 } } }