游程编码压缩及解压缩

学过GIS的人应该都知道,在这个大数据时代,我们的地图数据量有时候往往是非常庞大的,存储它将会耗费非常多的内存,读取速度也相对减慢了。所以GISer们常常会对栅格的地图数据进行压缩编码存储,等到要用到这个数据的时候再解压缩显示就好了,这样不仅可以节约大量的存储空间,而且节省了系统读取和反应的时间。栅格数据压缩编码的方法有很多种,包括链式编码、行程编码、块式编码和四叉树编码。今天我们就来讲一下行程编码(也叫游程编码)。

所谓游程编码,就是只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数,即按(属性值,重复个数)编码。例如:图像某一行一部分像素的颜色分别是222222222333333111(一个像素对应一个颜色代号),那么用游程编码的方式压缩就是293613,是不是就节省了一些空间呢?注意这才只是图像的一小部分,要是整个图像都用这种方法来存储,可想而知将会节省更多的空间啦!

我们假设给你一幅图像(这也是我以前做过的作业啦~\(≧▽≦)/~嘻嘻),这个图像是.dat格式的,按照第一个字节存储图像的宽度值Width(int型的哈),第二个字节存储图像的高度值Height,从第三个字节位置开始一直到最后存储的都是图像上每一个像素上的颜色(unsigned型)。

原图是这样的:

代码如下:

 1 // 栅格数据游程编码后解压缩.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include "Graph.h"
 6 #include "malloc.h"
 7
 8 void drawpicture(unsigned R[]);
 9
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     unsigned * a=NULL,* b=NULL,* c=NULL;
13
14     FILE* fp = fopen("../图片int.dat", "rb");//二进制文件读操作
15     if (fp)
16     {
17         //读入数组
18         int width, height;
19         fread(&width, sizeof(int), 1, fp);
20         fread(&height, sizeof(int), 1, fp);
21
22         a = (unsigned*)malloc(sizeof(unsigned)* (width * height + 2));
23         a[0] = width;
24         a[1] = height;
25         fread(a + 2, sizeof(unsigned), width*height, fp);
26     }
27     fclose(fp);
28
29
30     printf("原图为:");
31     drawpicture(a);
32
33
34     //游程编码压缩
35     int w = 2 + a[0]*a[1];
36
37     b = (unsigned*)malloc(sizeof(unsigned)* (2 * w));
38     b[0] = a[0];
39     b[1] = a[1];
40     int j = 3, t = a[2];
41     for (int i = 3; i <= w; i++)//b[2]存放的是b[2]到数组末尾一共的元素个数
42     {
43         int n = 1;
44         for (; i < w && a[i] == t; i++)
45             n++;
46
47         b[j++] = t;
48         b[j++] = n;
49
50         if (i < w)
51             t = a[i];
52         else
53             break;
54     }
55     b[2] = j;
56     printf("压缩完成.");
57     //压缩完毕
58
59     //解压缩
60
61     c = (unsigned*)malloc(sizeof(unsigned)* (b[0] * b[1] + 2));
62     c[0] = b[0];
63     c[1] = b[1];
64     int k = 2;
65     for (int i = 3; i<b[2]; i += 2)
66     {
67         for (j = 0; j < b[i + 1]; j++)
68             c[k++] = b[i];
69     }
70     //解压完毕
71
72     clearWindow();
73     printf("现在图为:");
74     drawpicture(c);
75     clearWindow();
76 }
77
78 void drawpicture(unsigned R[])
79 {
80     setOrig(100,100);
81
82     for (int i = 0; i < R[0] * R[1]; i++)
83     {
84         setPixel(i % R[0], i / R[0], R[i + 2]);
85     }
86     getchar();
87
88     clearWindow();
89
90     return ;
91 }

现在是见证奇迹的时刻,经过游程编码压缩后的图像,再解压后得到代码中的c数组,显示C数组的结果是否和压缩之前一模一样呢?!结果如下:

看看是不是还是一模一样呢!好啦,大功告成!

时间: 2024-10-11 10:12:58

游程编码压缩及解压缩的相关文章

Linux系统压缩及解压缩

==============================================================================  Linux系统解压缩 ============================================================================== 概述: 本篇将介绍Linux系统中的压缩和解压缩的工具,以及归档工具(tar,cpio) compress/uncompress:对应 .Z 结尾的压缩格式文件

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

Linux学习笔记&lt;十三&gt;——文件压缩、解压缩和归档

压缩.解压缩命令: 1.compress/uncompress:压缩格式为Z,文件后缀为.Z compress /path/to/file uncompress /path/to/file.Z 2.gzip/gunzip/zcat:压缩格式为gz,文件后缀为.gz gzip [OPTION] /path/to/file:,压缩文件保存在被压缩文件的目录,压缩完成后会删除原文件 -v|verbose:显示指令执行过程 -d:解压缩,解压缩完成后删除原压缩文件 -#:1-9,指定压缩比,默认为6,数

《转》python的zipfile压缩、解压缩

网上搜索了很多关于python的zipfile压缩.解压缩.觉得讲述比较详细,例子也很明了.由于比较懒,就直接复制了. 以下内容大部分转于 http://blog.csdn.net/jgood/article/details/4351911 zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下: class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) 创建一个Zi

Huffman的应用之文件压缩与解压缩

文件压缩与解压缩> 最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍> http://www.cricode.com/3481.html 下面开始介绍自己实现的文件压缩的思路和问题... 1).统计>读取一个文件统计这个文件中字符出现的次数. 2).建树&

linux压缩、解压缩及归档工具

压缩.解压缩及归档工具 compress/uncompress: .Z    gzip/gunzip: .gz    bzip2/bunzip2: .bz2    xz/unxz: .xz    zip/unzip    tar, cpio 1.gzip/gunzip gzip [OPTION]... FILE ...            -d: 解压缩,相当于gunzip            -c: 将结果输出至标准输出:            -#:1-9,指定压缩比: zcat:不显式

tar的打包-压缩与解压缩,并解压到指定的目录

tar在linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数:-x : 解压缩压缩档案的参数:-z : 是否需用用gzip压缩:-v: 压缩的过程中显示档案:-f: 置顶文档名,在f后面立即接文件名,不能再加参数 举例: 一,将整个/home/www/images 目录下的文件全部打包为 /home/www/images.tar[[email protected] ~]# tar -cvf /home/ww

linux笔记 文件的压缩与解压缩gzip、bzip2、xz、zip&unzip、tar打包、tar打包和压缩并用

压缩文件意义节省网络传输带宽,降低磁盘使用率.但会使用一定的cpu. 1.gzip 不支持压缩目录,gzip后直接跟文件名,在当前目录下压缩时,原文件会消失. #gzip filename 指定压缩目录:#gzip -c 123.txt > /tmp/123.txt.gz 将当前目录下123.txt文件压缩到tmp目录下名字为123.txt.gz 解压缩:#gzip -d file.gz #zcat file.gz  查看.gz文件内容 2.bzip2 不支持压缩目录,bzip2后可直接跟文件名

day 2 压缩与解压缩命令 扩展.md

常用压缩格式:.zip .gz .bz2 常用压缩格式: .tar.gz .tar.bz2 zip 压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 .zip格式解压缩 unzip压缩文件 解压缩.zip文件 .gz格式压缩 .gzip 源文件 压缩为.gz格式对压缩文件,源文件会消失 gzip -c 源文件 >压缩文件 压缩为.gz格式,源文件保留 例如:gzip -c abc > abc.gz gzip -r 目录 压缩目录下所有的子文件,但是不能压缩目录 .gz格