没有合适的资源?快使用搜索试试~ 我知道了~
JPEG图像的压缩与解压缩解读.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 187 浏览量
2021-09-13
18:12:34
上传
评论
收藏 317KB PDF 举报
温馨提示
试读
12页
...
资源推荐
资源详情
资源评论
JPEG 压缩操作过程
1. 为 JPEG 对象分配空间并初始化
2. 指定图像输出目标
3. 为压缩设定参数,包括图像大小,颜色空间
4. 开始压缩
5. 写入数据
6. 压缩完毕
7. 释放资源
为 JPEG 对象分配空间并初始化
压缩过程中使用的 JPEG 对象是一个 jpeg_compress_struct 的结构体。同时还需要定义一个用
于错误处理的结构体对象,IJG 中标准的错误结构体是 jpeg_error_mgr。
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
然后是将错误处理结构对象绑定在 JPEG 对象上。
cinfo.err = jpeg_std_error(&jerr);
这个标准的错误处理结构将使程序在出现错误时调用 exit()退出程序,如果不希望使用标准
的错误处理方式,则可以通过自定义退出函数的方法自定义错误处理结构,详情见文章后面
的专门章节。
初始化 cinfo 结构。
jpeg_create_compress(&cinfo);
指定图像输出目标
利用标准 C 中的文件指针传递要输出的 jpg 文件。
FILE * outfile;
if ((outfile = fopen(filename, "wb")) == NULL)
{
return 0;
}
jpeg_stdio_dest(&cinfo, outfile);
为压缩设定参数
在开始压缩数据之前需要为压缩指定几个参数和缺省参数。
设 定 缺省 参数 之前 需要指 定 的几 个参 数是 :图像 宽度 cinfo.image_width, 图 像高 度
cinfo.image_height,图像的颜色通道数 cinfo.input_components(比如 RGB 图像为 3,灰度图
为 1),图像颜色空间 cinfo.in_color_space(比如真彩色 JCS_RGB,灰度图 JCS_GRAYSCALE)。
如:
cinfo.image_width = 800;
cinfo.image_height = 600;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;//JCS_GRAYSCALE 表示灰度图,JCS_RGB 表示彩
色图像
然后是设定缺省设置
jpeg_set_defaults(&cinfo);
注意此处,在 set default 之前,必须设定 in_color_space,因为某些缺省参数的设定需要正确
的 color space 值。
在此之后还可以对其他的一些参数进行设定。具体有哪些参数可以查询libjpeg.doc 文档。
比如最常用的一个参数就是压缩比。
jpeg_set_quality(&cinfo, quality, TRUE);
quality 是个 0~100 之间的整数,表示压缩比率。
开始压缩
根据设定的压缩参数进行图像压缩操作。
jpeg_start_compress(&cinfo, TRUE);
开始压缩过程后就不可以修改 cinfo 对象参数。
写入数据
row_stride = image_width * 3; //假设用到的图示 RGB 真彩色三通道
同上文介绍的解压缩操作中介绍的,要写入的数据是按照行写入的,数据像素按照scanline
来存储,与读取数据的不同是使用 jpeg_write_scanlines。
类似于解压缩操作中的 cinfo.output_scanline < cinfo.output_height 机制,压缩过程使用的
cinfo.next_scanline < cinfo.image_height 来判断是否完成写入数据。
在此,假设 image_buffer 是个 JSAMPARRAY类型变量,其中保存的是要输出的图像数据,
比如可以是用上文中的解压缩操作从某 JPEG 文件中获得的数据。
JSAMPROW row_pointer;
while (cinfo.next_scanline < cinfo.image_height)
{
//找到图像中的某一行,写入目标文件
row_pointer = image_buffer[cinfo.next_scanline];
(void) jpeg_write_scanlines(&cinfo, &row_pointer, 1);
}
压缩完毕
jpeg_finish_compress(&cinfo);
释放资源
fclose(outfile);
jpeg_destroy_compress(&cinfo);
退出程序
如果不再需要 JPEG 对象,则使用
jpeg_destroy_compress(&cinfo);
或
jpeg_destroy(&cinfo);
剩余11页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功