首页 / 算法 / C语言程序设计之RLE压缩解压算法
C语言程序设计之RLE压缩解压算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C语言程序设计之RLE压缩解压算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2333字,纯文字阅读大概需要4分钟。
内容图文
先介绍一下RLE压缩算法:
游程编码(Run-Length Encoding, RLE)又称行程长度编码或者变动长度编码法,在控制理论中对于二值图像而言是一种编码方法,对连续的黑,白向像素以不同的码字进行编码。游程编码是一种简单的无损压缩方法,其特点是压缩和解压缩都非常快。该方法是用重复字节和重复次数来简单的描述重复的字节,也就是将一串连续的相同数据转换为特定的格式来达到压缩的目的。
RLE是一种简单的压缩算法,主要用于压缩图像中连续的重复的颜色块。当然RLE并不是只能应用于图像压缩上,RLE能压缩任何二进制数据。原始图像文件的数据有一个特点,那就是有大量连续重复的颜色数据,RLE正好是用来压缩有大量连续重复数据的压缩编码,但对于其他二进制文件而言,由于文件中相同的数据出现概率较少,使用RLE压缩这些数据重复性不强的文件效果不太理想,有时候压缩后的数据反而变大了。
RLE压缩方案是一种极其成熟的压缩方案,其特点是无损失压缩。
然后文件的一些基本操作我是看这篇博客了解的
最后就直接上代码了
(感觉仔细看了上面两个内容后就不用再过多解释了,代码里面有压缩函数的注释,解压和其相似就没有再写)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void zip(char *filename,char *outfile)
{//压缩函数
FILE *in, *out;
int filelen;
char cur,tmp;
if(!(in=fopen(filename,"rb")))//以二进制方式打开只读文件(原文件必须存在)
printf("文件打开失败\n");//若文件不存在则进行提示
else
{
out=fopen(outfile,"wb");/*二进制方式打开只写文件
(若文件不存在则会进行创建,若存在则会覆盖原内容)*/
cur=fgetc(in);//读取一个字符,返回读取到的字符,当读到文件末尾则返回EOF
tmp=cur;
filelen=1;
while(!feof(in))
{
cur=fgetc(in);
if(cur==tmp){
filelen++;
}//进行RLE压缩
else{
fputc(filelen+'0',out);//写一个字符(此处是计数数字),若失败则返回EOF
fputc(tmp,out);//同上,此处是原字符
tmp=cur;
filelen=1;
}
}
}
fclose(in);
fclose(out);//关闭文件
}
void unzip(char *filename,char *outfile)
{//解压函数 ,注释会基本和上面一样 ,不再赘述
FILE *in, *out;
int filelen;
char cur;
if(!(in=fopen(filename,"rb")))
printf("文件打开失败\n");
else
{
out = fopen(outfile,"wb");
while(!feof(in)){
filelen = fgetc(in)-'0';
if(feof(in)) break;
cur = fgetc(in);
while(filelen--)
fputc(cur,out);
}
}
fclose(in);
fclose(out);
}
int main(int argc,char *argv[])
{//通过判断命令行参数进行相应操作
if(!strcmp(argv[2], "-d"))
{
unzip(argv[1], argv[3]);
printf("decompress finished\n");
}
else if(!strcmp(argv[2],"-c"))
{
zip(argv[1], argv[3]);
printf("compress finished\n");
}
else
printf("输入参数有误,请重新检查,-c : compress; -d : decompress\n");
return 0;
}
内容总结
以上是互联网集市为您收集整理的C语言程序设计之RLE压缩解压算法全部内容,希望文章能够帮你解决C语言程序设计之RLE压缩解压算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。