游程编码(Run-Length Encoding, RLE)又称行程长度编码或者变动长度编码法,在控制理论中对于二值图像而言是一种编码方法,对连续的黑,白向像素以不同的码字进行编码。游程编码是一种简单的无损压缩方法,其特点是压缩和解压缩都非常快。该方法是用重复字节和重复次数来简单的描述重复的字节,也就是将一串连续的相同数据转换为特定的格式来达到压缩的目的。 (感觉仔细看了上面两个内容后就不用再过多解释了,代码里面有压缩函数的注释,解压和其相似就没有再写)
先介绍一下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 finishedn"); } else if(!strcmp(argv[2],"-c")) { zip(argv[1], argv[3]); printf("compress finishedn"); } else printf("输入参数有误,请重新检查,-c : compress; -d : decompressn"); return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算