JPEG 及MJPEG开发笔记

http://blog.csdn.net/yes24/article/details/3711505

                                     JPEG 
    早期的照片采用原始的RGB和YUV等格式,这些格式有个不好的地方,就是照片太大,而jpeg则根据人体视觉的特点采用了YCbCr格式,大大压缩了照片的大小,但效果能却相当于没有失真。 
    JPEG的编,解码过程如下: 
编码, 
|源图像|---〉|正离散余弦变换|-->|量化|--〉|编码(常用霍夫曼编码)|--〉|JPEG图像| 
                (FDCT)    (自建量化表)      (自建编码表) 

解码, 

|JPEG图像|--〉|解码|--〉|逆量化|------〉|反离散余弦变换|--〉|原图像| 
       (使用编码时对应的编码表,量化表)    (IDCT) 

    其中,离散余弦变换是核心,正离散余弦变换(FDCT)可看成谐波分析仪,反离散余弦变换(IDCT)可看成谐波合成仪;图像失真来源于量化;霍夫曼编码主要是实现无损压缩,大意是,将出现概率大的信息,赋以短字长的码,而对于出现概率小的信息,赋以长字长的码,这样得到的编码结果将是最小的。不过由于会有相同概率的符号存在,所以编码不唯一。 


1. 色彩模型 
    JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色 
彩模型, 这里不多阐述. 只是说明, YCrCb 模型更适合图形压缩. 因为人眼对图片上 
的亮度 Y 的变化远比色度 C 的变化敏感. 我们完全可以每个点保存一个 8bit 的亮 
度值, 每 2x2 个点保存一个 Cr Cb 值, 而图象在肉眼中的感觉不会起太大的变化. 
所以, 原来用 RGB 模型, 4 个点需要 4x3=12 字节. 而现在仅需要 4+2=6 字节; 平 
均每个点占 12bit. 当然 JPEG 格式里允许每个点的 C 值都记录下来; 不过 MPEG 里 
都是按 12bit 一个点来存放的, 我们简写为 YUV12. 
[R G B] -> [Y Cb Cr] 转换 
------------------------- 
(R,G,B 都是 8bit unsigned) 
        | Y  |     |  0.299       0.587       0.114 |   | R |     | 0 | 
        | Cb |  =  |- 0.1687    - 0.3313      0.5   | * | G |   + |128| 
        | Cr |     |  0.5       - 0.4187    - 0.0813|   | B |     |128| 
Y = 0.299*R + 0.587*G + 0.114*B  (亮度) 
Cb =  - 0.1687*R - 0.3313*G + 0.5   *B + 128 
Cr =    0.5   *R - 0.4187*G - 0.0813*B + 128 
[Y,Cb,Cr] -> [R,G,B] 转换 
------------------------- 
R = Y                    + 1.402  *(Cr-128) 
G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128) 
B = Y + 1.772  *(Cb-128) 
    一般, C 值 (包括 Cb Cr) 应该是一个有符号的数字, 但这里被处理过了, 方法 
是加上了 128. JPEG 里的数据都是无符号 8bit 的. 
2. DCT (离散余弦变换) 
    JPEG 里, 要对数据压缩, 先要做一次 DCT 变换. DCT 变换的原理, 涉及到数学 
知识, 这里我们不必深究. 反正和傅立叶变换(学过高数的都知道) 是差不多了. 经过 
这个变换, 就把图片里点和点间的规律呈现出来了, 更方便压缩.JPEG 里是对每 8x8 
个点为一个单位处理的. 所以如果原始图片的长宽不是 8 的倍数, 都需要先补成 8 
的倍数, 好一块块的处理. 另外, 记得刚才我说的 Cr Cb 都是 2x2 记录一次吗? 所 
以大多数情况, 是要补成 16x16 的整数块.按从左到右, 从上到下的次序排列 (和我 
们写字的次序一样). JPEG 里是对 Y Cr Cb 分别做 DCT 变换的. 这里进行 DCT 变换 
的 Y, Cr, Cb 值的范围都是 -128~127. (Y 被减去 128) 
    JPEG 编码时使用的是 Forward DCT (FDCT) 解码时使用的 Inverse DCT (IDCT) 
下面给出公式: 
FDCT: 
                             7   7                 2*x+1                2*y+1 
F(u,v) = alpha(u)*alpha(v)* sum sum f(x,y) * cos (------- *u*PI)* cos (------ *v*PI) 
                            x=0 y=0                 16                   16 
u,v = 0,1,...,7 
               { 1/sqrt(8)  (u==0) 
alpha(u) = { 
               { 1/2        (u!=0) 
IDCT: 
          7   7                                 2*x+1                2*y+1 
f(x,y) = sum sum alpha(u)*alpha(v)*F(u,v)*cos (------- *u*PI)* cos (------ *v*PI) 
         u=0 v=0                                 16                   16 
x,y=0,1...7 
    这个步骤很花时间, 另外有种 AA&N 优化算法, 大家可以去 inet 自己找一下. 
在 Intel 主页上可以找到 AA&N IDCT 的 MMX 优化代码. ( Intel 主页上的代码, 
输入数据为 12.4 的定点数, 输入矩阵需要转置 90 度) 



------------------------------------------------------------------------------------- 
                                         JFIF 

JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记: 

  1. SOI  0xD8            图像开始
  2. APP0 0xE0            JFIF应用数据块
  3. APPn 0xE1 - 0xEF    其他的应用数据块(n, 1~15)
  4. DQT  0xDB           量化表
  5. SOF0 0xC0            帧开始
  6. DHT  0xC4           霍夫曼(Huffman)表
  7. SOS  0xDA           扫描线开始
  8. EOI  0xD9            图像结束

JPEG文件由下面的8个部分组成: 
(1) 图像开始SOI(Start of Image)标记 
(2) APP0标记(Marker) 
① APP0长度(length) 
② 标识符(identifier) 
③ 版本号(version) 
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米) 
⑤ X方向像素密度(X density) 
⑥ Y方向像素密度(Y density) 
⑦ 缩略图水平像素数目(thumbnail horizontal pixels) 
⑧ 缩略图垂直像素数目(thumbnail vertical pixels) 
⑨ 缩略图RGB位图(thumbnail RGB bitmap) 
(3) APPn标记(Markers),其中n=1~15(任选) 
① APPn长度(length) 
② 由于详细信息(application specific information) 
(4) 一个或者多个量化表DQT(difine quantization table) 
① 量化表长度(quantization table length) 
② 量化表数目(quantization table number) 
③ 量化表(quantization table) 
(5) 帧图像开始SOF0(Start of Frame) 
① 帧开始长度(start of frame length) 
② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component) 
③ 图像高度(image height) 
④ 图像宽度(image width) 
⑤ 颜色分量数(number of color components) 
⑥ 对每个颜色分量(for each component) 
    • ID
    • 垂直方向的样本因子(vertical sample factor)
    • 水平方向的样本因子(horizontal sample factor)
    • 量化表号(quantization table#)
(6) 一个或者多个霍夫曼表DHT(Difine Huffman Table) 
① 霍夫曼表的长度(Huffman table length) 
② 类型、AC或者DC(Type, AC or DC) 
③ 索引(Index) 
④ 位表(bits table) 
⑤ 值表(value table) 
(7) 扫描开始SOS(Start of Scan) 
① 扫描开始长度(start of scan length) 
② 颜色分量数(number of color components) 
③ 每个颜色分量 
    • ID
    • 交流系数表号(AC table #)
    • 直流系数表号(DC table #)
④ 压缩图像数据(compressed image data) 
(8) 图像结束EOI(End of Image) 
------------------------------------------------------------------------------------- 
                                      EXIF 
        EXIF文件,最初由小日本电子业提出,它遵循JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和缩略图。 

       简单来说,EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。 

     所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字符。 
  0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标准,检索出它们的具体含义,一般而言包括以下一些信息: 
Image Description 图像描述、来源. 指生成图像的工具 
Artist作者 有些相机可以输入使用者的名字 
Make 生产者 指产品生产厂家 
Model 型号 指设备型号 
Orientation方向 有的相机支持,有的不支持 
XResolution/YResolution X/Y方向分辨率本栏目已有专门条目解释此问题。 
ResolutionUnit分辨率单位 一般为PPI 
Software软件 显示固件Firmware版本 
DateTime日期和时间 
YCbCrPositioning 色相定位 
ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。 
ExposureTime 曝光时间 即快门速度 
FNumber光圈系数 
ExposureProgram曝光程序指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。 
ISO speed ratings感光度 
ExifVersionExif版本 
DateTimeOriginal创建时间 
DateTimeDigitized数字化时间 
ComponentsConfiguration图像构造(多指色彩组合方案) 
CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度 
ExposureBiasValue曝光补偿。 
MaxApertureValue最大光圈 
MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。 
Lightsource光源 指白平衡设置 
Flash是否使用闪光灯。 
FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录 
FlashPixVersionFlashPix版本 (个别机型支持) 
ColorSpace色域、色彩空间 
ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数 
ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数 
Interoperability IFD通用性扩展项定义指针和TIFF文件相关,具体含义不详 
FileSource源文件 Compression压缩比。 

 


上图是EXIF在JPEG里面应用的结构。 
在应用过程中,通常使用2个 IFD, 0th IFD 存放数据,位置在TAG里面,下文会提到。 1th IIFD 存放缩略图指针。 

------------------------------------------------------------------------------------- 

                                            TIFF 

  TIFF图像文件由三个数据结构组成,分别为文件头、一个或多个称为IFD的包含标记指针的目录以及数据本身。 
  TIFF图像文件中的第一个数据结构称为图像文件头或IFH。这个结构是一个TIFF文件中唯一的、有固定位置的部分;IFD图像文件目录是一个字节长度可变的信息块,Tag标记是TIFF文件的核心部分,在图像文件目录中定义了要用的所有图像参数,目录中的每一目录条目就包含图像的一个参数。 

 


上面是TIFF的结构。 



------------------------------------------------------------------------------------- 

参考文档: 
JPEG简易文档2.14 云风 
TIFF revision 6.0 
EXIF version 2.1 
网络资料等 

你可能感兴趣的:(Multimedia)