本篇是该系列的第五篇,承接上篇huffman解码,介绍接下来的两个步骤——反量化和逆zigzag变换,即IDCT前的两个步骤。

  需要说明的是,这两个步骤可以颠倒,本人的实现是,先反量化,再逆ZigZag变换。

  其实,这两步不需要太多说明,无非是查表对数据进行scale和数据重排,为了完整性,还是介绍一下吧。

1. 反量化

  先拿到两个表,一个是解析文件头得到的量化表,另外一个是huffman解码得到的重建的8x8的block表。如下:

     

  如何操作?对应位置相乘,即得到的反量化表:

 2. 逆ZigZag变换

  反量化表dequantization table是由如下ZigZag方式扫描得到的(忽略数字,关注箭头扫描方向):

  因此,需要对该表进行恢复,得到:

  如何操作?无非是查表,可以参考下面的代码实现:

 1 static const uint8_t zigzag[64] =
2 {
3 0, 1, 5, 6, 14, 15, 27, 28,
4 2, 4, 7, 13, 16, 26, 29, 42,
5 3, 8, 12, 17, 25, 30, 41, 43,
6 9, 11, 18, 24, 31, 40, 44, 53,
7 10, 19, 23, 32, 39, 45, 52, 54,
8 20, 22, 33, 38, 46, 51, 55, 60,
9 21, 34, 37, 47, 50, 56, 59, 61,
10 35, 36, 48, 49, 57, 58, 62, 63
11 };
12
13 // IZigZag
14 int JpegReZigZag(struct ABitReader *abr, struct jpegParam *param, int *dst_block, const int *src_block, bool dump)
15 {
16 for (int i=0; i<64; i++) {
17 dst_block[i] = src_block[zigzag[i]];
18 }
19
20 if (dump) {
21 puts("----after rezigzag----");
22 for (int i=0; i<64; i++) {
23 printf("%4d ", dst_block[i]);
24 if (i % 8 == 7)
25 puts("");
26 }
27 puts("");
28 }
29
30 return 0;
31 }

JPEG解码——(5)反量化和逆ZigZag变换的更多相关文章

  1. JPEG解码--(1)JPEG文件格式概览

    由于懒和人的忘性,以前做的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有需要的来参考. 了解的人知道其价值所在,不知道的人就弃之如废物吧. 本篇是JPEG解码系列的第一篇--JPE ...

  2. JPEG解码——(3)文件头解析

    与具体的编码数据空间相比,jpeg文件头占据非常小乃至可以忽略不计的大小. 仍然拿JPEG解码--(1)JPEG文件格式概览中的<animal park>这张图片来举例,从跳过SOS(FF ...

  3. iOS-地图定位 && 解码与反解码

             前段时间,公司开发的App用到了地图和定位,所以记录一下,作为回顾总结.     对于地图和定位,苹果公司提供给了两个框架: MapKit:用于地图展示 Core Location ...

  4. JPEG解码——(6)IDCT逆离散余弦变换

    本篇是该系列的第六篇,承接上篇IZigZag变换,介绍接下来的一个步骤--逆离散余弦变换,即逆零偏置前的一个步骤. 该步骤比较偏理论,其业务是对IZigZag变换后的数据,再进一步的处理,使其恢复DC ...

  5. jpeg解码库使用实例

    jpeg库下载地址: http://www.ijg.org/ 交叉编译三部曲: A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpe ...

  6. JPEG解码——(4)霍夫曼解码

    本篇是该系列的第四篇,主要介绍霍夫曼解码相关内容. 承接上篇,文件头解析完毕后,就进入了编码数据区域,即SOS的tag后的区域,也是图片数据量的大头所在. 1. 解码过程规则描述 a)从此颜色分量单元 ...

  7. Matlab 仿真实现TI Instaspin 的Foc 逆Clarke变换和SVPWM

    一直没搞明白TI 的Instaspin的SVPWM实现原理,最后只能在Matlab里仿真看看输出波形是不是和普通的SVPWM实现输出的波形一样,用M文件实现,下面是代码: clear all; the ...

  8. jpeg软解码实现介绍

    我的月经贴博客该更新了!!!已经有许多博文需要补了! 去年开始的jpeg解码项目,中间停止更新了大半年时间,上个月想起这事还没完工,就又做了更多兼容性和性能上的改进,目前终于接近尾声了.有需要参考的可 ...

  9. h.264 Mode Decision

    Mode Decision(模式选择)决定一个宏块以何种类型进行分割.宏块的分割类型有以下几种: //P_Skip and B_Skip means that nothing need to be e ...

随机推荐

  1. HHKB Programming Contest 2020【ABCE】

    比赛链接:https://atcoder.jp/contests/hhkb2020/tasks A - Keyboard 代码 #include <bits/stdc++.h> using ...

  2. 设计模式(十八)——观察者模式(JDK Observable源码分析)

    1 天气预报项目需求,具体要求如下: 1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2) 需要设计开放型 API,便于其他第三方也能接入气象 ...

  3. http post请求数组参数写法

    1.json形式 body如下(注意是中括号): [ *, *, * ] postman: fiddler: 2.x-www-form-urlencoded postman: fiddler: 3.服 ...

  4. PowerShell随笔3 ---别名

    上一篇提到了别名,这个有必要说一下,因为我们常常会遇到以下两种情况: 自己写脚本,想快速一些,使用命名 看别人的脚本,发现别人和你想的一样,用了别名,但是你忘记了这个别名是什么意思. 我们可以通过Ge ...

  5. Python 遭遇 ProxyError 问题记录

    最近遇到的一个问题,在搞清楚之后才发现这么多年的 HTTPS_PROXY 都配置错了! 起因 想用 Python 在网上下载一些图片素材,结果 requests 报错 requests.excepti ...

  6. Chapter Zero 0.1.3 其他单元设备以及运作流程

    其他单元设备 五大单元中的控制单元.算数逻辑段元都被整合到CPU的封装中, 但其实系统单元中,不止有CPU(控制单元.算数逻辑单元), 计算机单元还有哪些? 系统单元:系统单元包括CPU.主存储器(内 ...

  7. spring-cloud-netflix-eureka-client

    服务注册中心eureka-server已经搭好,我们开始编写一个eureka-client,并提供一个hello服务 一.新建module,选择对应的springcloud模块,pom.xml如下: ...

  8. webpack4.0源码解析之esModule打包分析

    入口文件index.js采用esModule方式导入模块文件,非入口文件index1.js分别采用CommonJS和esmodule规范进行导出. 首先,init之后创建一个简单的webpack基本的 ...

  9. Recoil & React official state management

    Recoil & React official state management Redux Recoil.js https://recoiljs.org/ A state managemen ...

  10. .bashrc & rename hostname & rename username

    .bashrc & rename hostname & rename username mbp $ pwd $ cd ~ $ pwd $ cat .bashrc $ vim .bash ...