JPEG 图像格式详解JPEG 压缩简介-------------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.2990.5870.114 || R || 0 || Cb |=|- 0.1687- 0.33130.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 + 128Cr =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:772*x+12*y+1F(u,v) = alpha(u)*alpha(v)* sum sum f(x,...