9crk

9crk

1个粉丝

34

问答

0

专栏

6

资料

9crk  发布于  2015-01-04 14:23:11
采纳率 0%
34个问答
5611

图像无损压缩——zlib使用笔记

其实就是通用数据的压缩,不过恰巧用在了这里。很多时候,希望保留尽量多的图像细节,通过网络或USB传输到PC进行处理,就要用到无损压缩。


贴一下主要函数:

[quote](1)int compress (Bytef *dest,   uLongf *destLen, const Bytef *source, uLong sourceLen);
把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定
(2) int compress2 (Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间
(3) uLong compressBound (uLong sourceLen);
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
(4) int uncompress (Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen);[/quote]

下载zlib1.2.8后,将顶层文件夹中所有c和h文件拷贝到visual studio工程中
添加所有c文件到工程中
然后编写如下代码:
[code]/* author:9crk 2014-12-14*/
#include "stdio.h"
#include "zlib/zconf.h"
#include "zlib/zlib.h"
int main()
{

   //原始数据
   Bytef myData[10000];
   //压缩后
   Bytef outPut[10000];
   //解压后
   Bytef uncompressData[20000];
   //初始化待压缩数据
   for(int k=0;k<10000;k++)myData[k] = k%255;
   
   uLongf i=10000;//严重注意,这个必须初始化为output的大小(或者比较大的一个数)
   int ret = compress(outPut, &i, myData,(uLongf)10000);
   printf("ret = %d, i = %d\n",ret, i);

   uLongf j=20000;//注意这个必须是uncompressData的大小(或者比较大的一个数)
   ret = uncompress(uncompressData, &j, outPut, i);
   printf("ret = %d, j = %d\n",ret, j);

   printf("finished\n");
}[/code]

注意文中的汉字说明,否则compress和uncompress函数都会返回-5.
运行结果:
ret = 0, i = 368
ret = 0, j = 10000
finished
请按任意键继续. . .
我来回答
回答5个
时间排序
认可量排序

ebaina_

0个粉丝

82

问答

40

专栏

0

资料

ebaina_ 2015-01-04 15:23:19
认可0
新年第一奖品,本期普及奖品 ,9crk 同样获得 100元话费。 发个邮件确认下手机号,发消息。:lol

ns001x

0个粉丝

28

问答

0

专栏

1

资料

ns001x 2015-01-04 17:32:11
认可0
一直比较纠结 什么叫无损压缩,既然压缩就肯定是有损失的。

9crk

1个粉丝

34

问答

0

专栏

6

资料

9crk 2015-01-04 21:08:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=10865&ptid=4951]ns001x 发表于 2015-1-4 17:32[/url]
一直比较纠结 什么叫无损压缩,既然压缩就肯定是有损失的。[/quote]

比如你的文本,压缩成.zip格式,如果是有损压缩,肯定就恢复不回来了。

无损压缩就是可恢复为原来的样子的。

ns001x

0个粉丝

28

问答

0

专栏

1

资料

ns001x 2015-01-05 09:20:37
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=10871&ptid=4951]9crk 发表于 2015-1-4 21:08[/url]
比如你的文本,压缩成.zip格式,如果是有损压缩,肯定就恢复不回来了。

无损压缩就是可恢复为原来的样 ...[/quote]

受教。一个困惑自己很久的问题。:D

lzts

0个粉丝

0

问答

0

专栏

0

资料

lzts 2018-03-12 17:16:16
认可0
学习下,谢谢分享
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区