实验5 | JPEG原理分析及JPEG解码器的调试

一、实验目的

掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。

二、实验内容

1.JPEG编解码原理

在这里插入图片描述
JPEG编码的过程如上图所示,解码是编码的逆过程。

2.JPEG文件格式

(1)SOI & EOI

SOI (Start of Image):图像开始
标记代码 2字节 固定值0xFFD8
EOI(End of Image):图像结束 2字节
标记代码 2字节 固定值0xFFD9

(2)APP0:应用程序保留标记0

标记代码:2字节 固定值0xFFE0
包含9个具体字段:
① 数据长度:2字节,①~⑨9个字段的总长度
② 标识符:5字节,固定值0x4A46494600,即字符串“JFIF0”
③ 版本号:2字节,一般是0x0102,表示JFIF的版本号1.2
④ X和Y的密度单位:1字节,只有三个值可选
0:无单位;1:点数/英寸;2:点数/厘米
⑤ X方向像素密度:2字节,取值范围未知
⑥ Y方向像素密度:2字节,取值范围未知
⑦ 缩略图水平像素数目:1字节,取值范围未知
⑧ 缩略图垂直像素数目:1字节,取值范围未知
⑨ 缩略图RGB位图:长度可能是3的倍数
缩略图RGB位图数据

(3)DQT:定义量化表

标记代码:2字节,固定值0xFFDB
包含9个具体字段:
① 数据长度:2字节,段①和多个字段②的总长度
② 量化表 数据长度-2字节

a) 精度及量化表ID:1字节	
   高4位:精度,只有两个可选值
   0:8位;1:16位
   低4位:量化表ID,取值范围为0~3
b) 表项:(64×(精度+1))字节

本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次

(4)SOF0:帧图像开始

标记代码:2字节,固定值0xFFC0
包含9个具体字段:
① 数据长度:2字节,①~⑥六个字段的总长度
② 精度:1字节,每个数据样本的位数
通常是8位,一般软件都不支持 12位和16位
③ 图像高度:2字节,图像高度(单位:像素)
④ 图像宽度:2字节,图像宽度(单位:像素)
⑤ 颜色分量数:1字节 只有3个数值可选
1:灰度图;3:YCrCb或YIQ;4:CMYK
而JFIF中使用YCrCb,故这里颜色分量数恒为3
⑥颜色分量信息:颜色分量数×3字节(通常为9字节)
a)颜色分量ID:1字节
b)水平/垂直采样因子:1字节
高4位:水平采样因子 低4位:垂直采样因子
c) 量化表:1字节。当前分量使用的量化表的ID

(5)DHT:定义哈夫曼表

标记代码:2字节,固定值0xFFC4
包含2个具体字段:
① 数据长度:2字节
② huffman表:数据长度2字节
表ID和表类型:1字节
高4位:类型,只有两个值可选(0:DC直流;1:AC交流)
低4位:哈夫曼表ID(注意,DC表和AC表分开编码)
不同位数的码字数量:16字节
编码内容:16个不同位数的码字数量之和(字节)。本标记段中,字段②可以重复出现(一般4次),也可以只出现1次。

(6)SOS:扫描开始

标记代码:2字节,固定值0xFFDA
包含2个具体字段:
①数据长度:2字节,①~④两个字段的总长度
②颜色分量数:1字节,应该和SOF中的字段⑤的值相同,即:1:灰度图是;3: YCrCb或YIQ;4:CMYK。
③颜色分量信息
a) 颜色分量ID:1字节
b) 直流/交流系数表号:1字节
高4位:直流分量使用的哈夫曼树编号
低4位:交流分量使用的哈夫曼树编号
④ 压缩图像数据
a)谱选择开始:1字节,固定值0x00
b)谱选择结束:1字节,固定值0x3F
c)谱选择:1字节,在基本JPEG中总为00

三、实验步骤

1.将输入的JPG文件进行解码,将输出文件保存为可供YUVViewer观看的YUV文件。

static void write_yuv(const char *filename, int width, int height, unsigned char **components)
{
   
	FILE *F;
	char temp[1024];
	snprintf(temp, 1024, "%s.Y", filename);
    F = fopen(temp, "wb");
    fwrite(components[0], width, heig
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值