数据压缩算法学习(一)---RLE算法

简介

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);      // 按照压缩的规则依次“解压”:即是先读取该字符出现的次数,然后循环输出即可
		}
	}
}


运行结果如下:
压缩效果:

数据压缩算法学习(一)---RLE算法_第1张图片


解压效果:
数据压缩算法学习(一)---RLE算法_第2张图片

【未完待续】...这个只是最简单的实现...


你可能感兴趣的:(数据压缩算法学习(一)---RLE算法)