本篇是该系列的第五篇,承接上篇huffman解码,介绍接下来的两个步骤--反量化和逆zigzag变换,即IDCT前的两个步骤. 需要说明的是,这两个步骤可以颠倒,本人的实现是,先反量化,再逆ZigZag变换. 其实,这两步不需要太多说明,无非是查表对数据进行scale和数据重排,为了完整性,还是介绍一下吧. 1. 反量化 先拿到两个表,一个是解析文件头得到的量化表,另外一个是huffman解码得到的重建的8x8的block表.如下:       如何操作?对应位置相乘,即得到的反量化表:  2.…
由于懒和人的忘性,以前做的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有需要的来参考. 了解的人知道其价值所在,不知道的人就弃之如废物吧. 本篇是JPEG解码系列的第一篇--JPEG文件格式概览. 1. 图片文件的数据是什么? 这是一幅人眼可视的图片: 这是其对应的二进制数据:(由于二进制数据量浩如烟海,只截取头部的一些数据,使用的工具是WinHex)  2. 为什么需要文件格式来表达图像? 这就凸显了规范的重要性,使用同一套标准,各厂商都按照这个标准进行文件格式封装,那么你…
与具体的编码数据空间相比,jpeg文件头占据非常小乃至可以忽略不计的大小. 仍然拿JPEG解码--(1)JPEG文件格式概览中的<animal park>这张图片来举例,从跳过SOS(FF DA)的TAG开始--0x153, 就真正进入了编码数据区域,如下图所示: 其占据的比例为:0x153/0x9721 = 339/38689 = 0.876%,还不到1%,其他jpeg图片也是类似情况. 但是,就是这么小的数据区域,却是至关重要的地方,某些关键的地方一个字节出错了的话,解码就会出错(例如hu…
         前段时间,公司开发的App用到了地图和定位,所以记录一下,作为回顾总结.     对于地图和定位,苹果公司提供给了两个框架: MapKit:用于地图展示 Core Location :用于地理定位 CoreLocation的使用: 1.导入头文件      #import<CoreLocation/CoreLocation.h> CoreLocation框架使用须知 CoreLocation框架中所有数据类型的前缀都是CL CoreLocation中使用CLLocationM…
本篇是该系列的第六篇,承接上篇IZigZag变换,介绍接下来的一个步骤--逆离散余弦变换,即逆零偏置前的一个步骤. 该步骤比较偏理论,其业务是对IZigZag变换后的数据,再进一步的处理,使其恢复DCT变换前的数据. 需要补充一点说明的是,上面的DCT其实是DCT2,因为jpeg编码下都是对8x8的像素块进行处理. 1. 理论 1.1. 背景 DCT,即离散余弦变换,常用图像压缩算法,步骤如下 1)分割,首先将图像分割成8x8或16x16的小块: 2)DCT变换,对每个小块进行DCT变换: 3)…
jpeg库下载地址: http://www.ijg.org/ 交叉编译三部曲: A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpeg-install B make C make install jpeg库是解压jpeg/jpg图片或将图片压缩为jpeg/jpg格式所用到的库,使用起来比较简单! jpeg/jpg解码过程: 1. 创建jpeg对象和错误处理对象 struct jpeg_decompress_struct cinf…
本篇是该系列的第四篇,主要介绍霍夫曼解码相关内容. 承接上篇,文件头解析完毕后,就进入了编码数据区域,即SOS的tag后的区域,也是图片数据量的大头所在. 1. 解码过程规则描述 a)从此颜色分量单元数据流的起点开始一位一位的读入,直到读入的编码与该分量直流哈夫曼树的某个码字(叶子结点)一致,然后用直流哈夫曼树 查得该码字对应的权值.权值(共8位)表示该直流分量数值的二进制位数,也就是接下来需要读入的位数. b)继续读入位数据,直到读入的编码与该分量交流哈夫曼树的某个码字(叶子结点)一致,然后用…
一直没搞明白TI 的Instaspin的SVPWM实现原理,最后只能在Matlab里仿真看看输出波形是不是和普通的SVPWM实现输出的波形一样,用M文件实现,下面是代码: clear all; theta = 0:1:360; vd = 0.0; vq = 1.15; Valpha = zeros(size(theta)); Vbeta = zeros(size(theta)); Vx = zeros(size(theta)); Vy = zeros(size(theta)); Vz = zer…
我的月经贴博客该更新了!!!已经有许多博文需要补了! 去年开始的jpeg解码项目,中间停止更新了大半年时间,上个月想起这事还没完工,就又做了更多兼容性和性能上的改进,目前终于接近尾声了.有需要参考的可以进去下载. 为了便于阅读,有必要从下面几点展开本博文: 1.为什么写这篇博文? 一来是对前期忙活事情的总结,二来是向感兴趣人们的介绍我的实现,三来为x264学习做一些铺垫性工作. 在此,要感谢一个台湾同仁提供的示范(由R语言编译)和说明,没有他的demo,我的这个demo也无法完工.因为解码过程是…
Mode Decision(模式选择)决定一个宏块以何种类型进行分割.宏块的分割类型有以下几种: //P_Skip and B_Skip means that nothing need to be encoded for this macroblock , // just use the mv predicted to restruct the macroblock //B_Direct means use no mvd and no refidx, // just use the mv abt…