1.音视频探索(5):JPEG格式与Libjpeg库编译移植
2.ç®è¿°JPEGçå缩åç
3.简述JPEG的压缩源码压缩原理
4.JPEG是什么编码压缩技术
5.JPEGçå缩
6.令人拍案叫绝的JPEG图像压缩原理
音视频探索(5):JPEG格式与Libjpeg库编译移植
音视频探索(5):JPEG格式与Libjpeg库编译移植
libJPEG-turbo是一个强大的JPEG图像处理库,广泛应用于Android系统图像压缩,压缩源码尤其在保证图像质量和色彩丰富的压缩源码场景。然而,压缩源码为适应低版本Android手机,压缩源码系统内部的压缩源码groove music 源码压缩算法并未采用全速的哈夫曼编码,因为这会占用过多CPU资源。压缩源码本文将采用Cmake工具编译libJPEG-turbo源码,压缩源码并利用JNI/NDK技术,压缩源码定制哈夫曼编码接口,压缩源码提升Android中的压缩源码压缩性能。
哈夫曼编码是压缩源码一种高效的无损压缩方式,它根据字符出现概率分配不同长度的压缩源码码字,出现频率高的压缩源码字符编码较短。在图像压缩中,压缩源码通过扫描图像数据确定像素概率,构造赫夫曼树,源码答题系统生成对应码表。例如,构建一颗赫夫曼树,其带权路径长度可通过叶子结点的权重和路径长度计算得出。
在libjpeg库中,压缩JPEG过程涉及分配结构体、设置输出、参数设置、按行处理数据等步骤。而解码则包括初始化对象、指定数据源、读取头部参数和解压数据等操作。源码分析显示,压缩和解压的核心结构体包含图像信息、参数配置和工作空间指针等关键部分。
要编译移植libjpeg-turbo,repleace源码分析首先在Android工程中配置CmakeLists.txt,然后编译生成对应的libjpeg.so文件。在使用时,需将库头文件和动态库引入到项目中,并在Java层编写JNI方法,实现Java与C/C++的交互,从而实现JPEG图像的高效编码和解码。
ç®è¿°JPEGçå缩åç
ããJPEGå缩åå个æ¥éª¤å®ç°ï¼
ããä¸ãé¢è²æ¨¡å¼è½¬æ¢åéæ ·ï¼
ããRGBè²å½©ç³»ç»æ¯æ们æ常ç¨ç表示é¢è²çæ¹å¼ãJPEGéç¨çæ¯YCbCrè²å½©ç³»ç»ãæ³è¦ç¨JPEGåºæ¬å缩æ³å¤çå ¨å½©è²å¾åï¼å¾å æRGBé¢è²æ¨¡å¼å¾åæ°æ®ï¼è½¬æ¢ä¸ºYCbCré¢è²æ¨¡å¼çæ°æ®ãY代表亮度ï¼CbåCrå代表è²åº¦ã饱å度ãéè¿ä¸å计ç®å ¬å¼å¯å®ææ°æ®è½¬æ¢ã Y=0.R+0.G+0.B Cb=-0.R-0.G+0.B+ Cr=0.R-0.G-0.Bï¼ äººç±»çç¼æ´å¯¹ä½é¢çæ°æ®æ¯å¯¹é«é¢çæ°æ®å ·ææ´é«çææ度ï¼äºå®ä¸ï¼äººç±»çç¼ç对亮度çæ¹åä¹æ¯å¯¹è²å½©çæ¹åè¦ææå¾å¤ï¼ä¹å°±æ¯è¯´Yæ份çæ°æ®æ¯æ¯è¾éè¦çãæ¢ç¶Cbæ份åCræ份çæ°æ®æ¯è¾ç¸å¯¹ä¸éè¦ï¼å°±å¯ä»¥åªåé¨åæ°æ®æ¥å¤çã以å¢å å缩çæ¯ä¾ãJPEGé常æ两ç§éæ ·æ¹å¼ï¼YUVåYUVï¼å®ä»¬æ代表çæä¹æ¯YãCbåCrä¸ä¸ªæ份çæ°æ®åæ ·æ¯ä¾ã
ããäºãDCTåæ¢ï¼
ããDCTåæ¢çå ¨ç§°æ¯ç¦»æ£ä½å¼¦åæ¢(Discrete Cosine Transform)ï¼æ¯æå°ä¸ç»å 强æ°æ®è½¬æ¢æé¢çæ°æ®ï¼ä»¥ä¾¿å¾ç¥å¼ºåº¦ååçæ å½¢ãè¥å¯¹é«é¢çæ°æ®åäºä¿®é¥°ï¼å转ååæ¥å½¢å¼çæ°æ®æ¶ï¼æ¾ç¶ä¸åå§æ°æ®æäºå·®å¼ï¼ä½æ¯äººç±»çç¼çå´æ¯ä¸å®¹æ辨认åºæ¥ã å缩æ¶ï¼å°åå§å¾åæ°æ®åæ8*8æ°æ®åå ç©éµãJPEGå°æ´ä¸ªäº®åº¦ç©éµä¸è²åº¦Cbç©éµï¼é¥±å度Crç©éµï¼è§ä¸ºä¸ä¸ªåºæ¬åå 称ä½MCUãæ¯ä¸ªMCUæå å«çç©éµæ°éä¸å¾è¶ è¿ä¸ªãä¾å¦ï¼è¡ååéæ ·çæ¯ä¾ç为4:2:2ï¼åæ¯ä¸ªMCUå°å å«å个亮度ç©éµï¼ä¸ä¸ªè²åº¦ç©éµåä¸ä¸ªé¥±å度ç©éµã å½å¾åæ°æ®åæä¸ä¸ª8*8ç©éµåï¼è¿å¿ é¡»å°æ¯ä¸ªæ°å¼åå»ï¼ç¶åä¸ä¸ä»£å ¥DCTåæ¢å ¬å¼ä¸ï¼å³å¯è¾¾å°DCTåæ¢çç®çãå¾åæ°æ®å¼å¿ é¡»åå»ï¼æ¯å 为DCTåæ¢å ¬å¼ææ¥åçæ°åèå´æ¯å¨-å°+ä¹é´ã
ããä¸ãéåï¼
ããå¾åæ°æ®è½¬æ¢ä¸ºé¢çç³»æ°åï¼è¿å¾æ¥åä¸é¡¹éåç¨åºï¼æè½è¿å ¥ç¼ç é¶æ®µãéåé¶æ®µéè¦ä¸¤ä¸ª8*8ç©éµæ°æ®ï¼ä¸ä¸ªæ¯ä¸é¨å¤ç亮度çé¢çç³»æ°ï¼å¦ä¸ä¸ªåæ¯é对è²åº¦çé¢çç³»æ°ï¼å°é¢çç³»æ°é¤ä»¥éåç©éµçå¼ï¼åå¾ä¸åæ°æè¿çæ´æ°ï¼å³å®æéåã å½é¢çç³»æ°ç»è¿éååï¼å°é¢çç³»æ°ç±æµ®ç¹æ°è½¬å为æ´æ°ï¼è¿æ便äºæ§è¡æåçç¼ç ãä¸è¿ï¼ç»è¿éåé¶æ®µåï¼æææ°æ®åªä¿çæ´æ°è¿ä¼¼å¼ï¼ä¹å°±å度æ失äºä¸äºæ°æ®å 容ã
ããåãç¼ç ï¼
ãã1ãç¼ç Huffmanç¼ç æ ä¸å©æé®é¢ï¼æ为JPEGæ常ç¨çç¼ç æ¹å¼ï¼Huffmanç¼ç é常æ¯ä»¥å®æ´çMCUæ¥è¿è¡çã ç¼ç æ¶ï¼æ¯ä¸ªç©éµæ°æ®çDCå¼ä¸ä¸ªACå¼ï¼å°åå«ä½¿ç¨ä¸åçHuffmanç¼ç 表ï¼è亮度ä¸è²åº¦ä¹éè¦ä¸åçHuffmanç¼ç 表ï¼æ以ä¸å ±éè¦å个ç¼ç 表ï¼æè½é¡ºå©å°å®æJPEGç¼ç å·¥ä½ã DCç¼ç DCæ¯å½©éç¨å·®å¼èå²ç¼ç è°å¶çå·®å¼ç¼ç æ³ï¼ä¹å°±æ¯å¨åä¸ä¸ªå¾ååéä¸åå¾æ¯ä¸ªDCå¼ä¸åä¸ä¸ªDCå¼çå·®å¼æ¥ç¼ç ãDCéç¨å·®å¼èå²ç¼ç ç主è¦åå æ¯ç±äºå¨è¿ç»è²è°çå¾åä¸ï¼å ¶å·®å¼å¤åæ¯åå¼å°ï¼å¯¹å·®å¼è¿è¡ç¼ç æéçä½æ°ï¼ä¼æ¯å¯¹åå¼è¿è¡ç¼ç æéçä½æ°å°è®¸å¤ãä¾å¦å·®å¼ä¸º5ï¼å®çäºè¿å¶è¡¨ç¤ºå¼ä¸ºï¼å¦æå·®å¼ä¸º-5ï¼åå æ¹ä¸ºæ£æ´æ°5ï¼åå°å ¶äºè¿å¶è½¬æ¢æ1çè¡¥æ°å³å¯ãæè°1çè¡¥æ°ï¼å°±æ¯å°æ¯ä¸ªBitè¥å¼ä¸º0ï¼ä¾¿æ¹æ1ï¼Bit为1ï¼ååæ0ãå·®å¼5åºä¿ççä½æ°ä¸º3ï¼ä¸è¡¨å³ååºå·®å¼æåºä¿ççBitæ°ä¸å·®å¼å 容çå¯¹ç §ã
ããå¨å·®å¼å端å¦å¤å å ¥ä¸äºå·®å¼çé夫æ¼ç å¼ï¼ä¾å¦äº®åº¦å·®å¼ä¸º5ï¼ï¼çä½æ°ä¸º3ï¼åé夫æ¼ç å¼åºè¯¥æ¯ï¼ä¸¤è è¿æ¥å¨ä¸èµ·å³ä¸ºãä¸åä¸¤ä»½è¡¨æ ¼åå«æ¯äº®åº¦åè²åº¦DCå·®å¼çç¼ç 表ãæ ¹æ®è¿ä¸¤ä»½è¡¨æ ¼å 容ï¼å³å¯ä¸ºDCå·®å¼å ä¸é夫æ¼ç å¼ï¼å®æDCçç¼ç å·¥ä½ï¼
ãã2ãACç¼ç æ¹å¼ä¸DCç¥æä¸åï¼å¨ACç¼ç ä¹åï¼é¦å å¾å°ä¸ªACå¼æZig-zagæåºï¼å³æç §ä¸å¾ç®å¤´ææ示ç顺åºä¸²èèµ·æ¥ã 个ACå¼æå好çï¼å°ACç³»æ°è½¬æ¢æä¸é´ç¬¦å·ï¼ä¸é´ç¬¦å·è¡¨ç¤ºä¸ºRRRR/SSSSï¼RRRRæ¯æ第éé¶çACä¹åï¼å ¶å¼ä¸º0çAC个æ°ï¼SSSSæ¯æACå¼æéçä½æ°ï¼ACç³»æ°çèå´ä¸SSSSç对åºå ³ç³»ä¸DCå·®å¼Bitsæ°ä¸å·®å¼å å®¹å¯¹ç §è¡¨ç¸ä¼¼ã å¦æè¿ç»ä¸º0çAC个æ°å¤§äºï¼åç¨/0æ¥è¡¨ç¤ºè¿ç»ç个0ï¼/0称为ZRLï¼Zero Rum Lengthï¼ï¼èï¼0/0ï¼ç§°ä¸ºEOBï¼Enel of Blockï¼ç¨æ¥è¡¨ç¤ºå ¶åæå©ä½çACç³»æ°ççäº0ï¼ä»¥ä¸é´ç¬¦å·å¼ä½ä¸ºç´¢å¼å¼ï¼ä»ç¸åºçACç¼ç 表ä¸æ¾åºéå½çé夫æ¼ç å¼ï¼åä¸ACå¼ç¸è¿å³å¯ã ä¾å¦æä¸ç»äº®åº¦çä¸é´ç¬¦ä¸º5/3ï¼ACå¼ä¸º4ï¼é¦å 以5/3为索å¼å¼ï¼ä»äº®åº¦ACçHuffmanç¼ç 表ä¸æ¾å°é夫æ¼ç å¼ï¼äºæ¯å ä¸åæ¥ï¼4ï¼å³æ¯ç¨æ¥å[5ï¼4]çHuffmanç¼ç ï¼[5ï¼4]表示ACå¼ä¸º4çåé¢æ5个é¶ã ç±äºäº®åº¦ACï¼è²åº¦ACé夫æ¼ç¼ç 表æ¯è¾é¿ï¼å¨æ¤çç¥å»ï¼æå ´è¶£è å¯åé ç¸å ³ä¹¦ç±ã å®ç°ä¸è¿°å个æ¥éª¤ï¼å³å®æä¸å¹ å¾åçJPEGå缩ã
简述JPEG的压缩原理
JPEG压缩分四个步骤实现:
一、颜色模式转换及采样: RGB色彩系统是我们最常用的表示颜色的方式。JPEG采用的是YCbCr色彩系统。想要用JPEG基本压缩法处理全彩色图像,得先把RGB颜色模式图像数据,转换为YCbCr颜色模式的数据。
二、DCT变换: DCT变换的全称是离散余弦变换(Discrete Cosine Transform),是声明式源码指将一组光强数据转换成频率数据,以便得知强度变化的情形。
三、量化: 图像数据转换为频率系数后,还得接受一项量化程序,才能进入编码阶段。
四、编码: 1、编码 Huffman编码无专利权问题,成为JPEG最常用的编码方式,Huffman编码通常是以完整的MCU来进行的。 编码时,每个矩阵数据的DC值与个AC值,将分别使用不同的Huffman编码表,而亮度与色度也需要不同的Huffman编码表,所以一共需要四个编码表,才能顺利地完成JPEG编码工作。rpgmakermv源码解析
JPEG是什么编码压缩技术
JPEG是一种图形文件。它是Joint Photo Graphic Experts Group制定的压缩标准产生的压缩格式,属J-PEG File Inter�Change Format,可以用不同的压缩比例对这种文件压缩。因压缩技术十分先进,文件小,图形质量高而被广泛运用于图像处理中。
没问什么原理压的就不说了,太长了^_^
JPEGçå缩
JPEGå缩è¿ç¨ JPEGå缩åå个æ¥éª¤å®ç°ï¼ 1.é¢è²æ¨¡å¼è½¬æ¢åéæ ·ï¼ 2.DCTåæ¢ï¼ 3.éåï¼ 4.ç¼ç ã äº. 1ï¼é¢è²æ¨¡å¼è½¬æ¢åéæ · RGBè²å½©ç³»ç»æ¯æ们æ常ç¨ç表示é¢è²çæ¹å¼ãJPEGéç¨çæ¯YCbCrè²å½©ç³»ç»ãæ³è¦ç¨JPEGåºæ¬å缩æ³å¤çå ¨å½©è²å¾åï¼å¾å æRGBé¢è²æ¨¡å¼å¾åæ°æ®ï¼è½¬æ¢ä¸ºYCbCré¢è²æ¨¡å¼çæ°æ®ãY代表亮度ï¼CbåCrå代表è²åº¦ã饱å度ãéè¿ä¸å计ç®å ¬å¼å¯å®ææ°æ®è½¬æ¢ã Y=0.R+0.G+0.B Cb=-0.R-0.G+0.B+ Cr=0.R-0.G-0.Bï¼ äººç±»çç¼æ´å¯¹ä½é¢çæ°æ®æ¯å¯¹é«é¢çæ°æ®å ·ææ´é«çææ度ï¼äºå®ä¸ï¼äººç±»çç¼ç对亮度çæ¹åä¹æ¯å¯¹è²å½©çæ¹åè¦ææå¾å¤ï¼ä¹å°±æ¯è¯´Yæ份çæ°æ®æ¯æ¯è¾éè¦çãæ¢ç¶Cbæ份åCræ份çæ°æ®æ¯è¾ç¸å¯¹ä¸éè¦ï¼å°±å¯ä»¥åªåé¨åæ°æ®æ¥å¤çã以å¢å å缩çæ¯ä¾ãJPEGé常æ两ç§éæ ·æ¹å¼ï¼YUVåYUVï¼å®ä»¬æ代表çæä¹æ¯YãCbåCrä¸ä¸ªæ份çæ°æ®åæ ·æ¯ä¾ã 2.DCTåæ¢ DCTåæ¢çå ¨ç§°æ¯ç¦»æ£ä½å¼¦åæ¢(Discrete Cosine Transform)ï¼æ¯æå°ä¸ç»å 强æ°æ®è½¬æ¢æé¢çæ°æ®ï¼ä»¥ä¾¿å¾ç¥å¼ºåº¦ååçæ å½¢ãè¥å¯¹é«é¢çæ°æ®åäºä¿®é¥°ï¼å转ååæ¥å½¢å¼çæ°æ®æ¶ï¼æ¾ç¶ä¸åå§æ°æ®æäºå·®å¼ï¼ä½æ¯äººç±»çç¼çå´æ¯ä¸å®¹æ辨认åºæ¥ã å缩æ¶ï¼å°åå§å¾åæ°æ®åæ8*8æ°æ®åå ç©éµï¼ä¾å¦äº®åº¦å¼ç第ä¸ä¸ªç©éµå 容å¦ä¸ï¼ JPEGå°æ´ä¸ªäº®åº¦ç©éµä¸è²åº¦Cbç©éµï¼é¥±å度Crç©éµï¼è§ä¸ºä¸ä¸ªåºæ¬åå 称ä½MCUãæ¯ä¸ªMCUæå å«çç©éµæ°éä¸å¾è¶ è¿ä¸ªãä¾å¦ï¼è¡ååéæ ·çæ¯ä¾ç为4:2:2ï¼åæ¯ä¸ªMCUå°å å«å个亮度ç©éµï¼ä¸ä¸ªè²åº¦ç©éµåä¸ä¸ªé¥±å度ç©éµã å½å¾åæ°æ®åæä¸ä¸ª8*8ç©éµåï¼è¿å¿ é¡»å°æ¯ä¸ªæ°å¼åå»ï¼ç¶åä¸ä¸ä»£å ¥DCTåæ¢å ¬å¼ä¸ï¼å³å¯è¾¾å°DCTåæ¢çç®çãå¾åæ°æ®å¼å¿ é¡»åå»ï¼æ¯å 为DCT转æ¢å ¬å¼ææ¥åçæ°åèå´æ¯å¨-å°+ä¹é´ã DCTåæ¢å ¬å¼ï¼ x,y代表å¾åæ°æ®ç©éµå æ个æ°å¼çåæ ä½ç½®f(x,y)代表å¾åæ°æ®ç©éµå çæ°ä¸ªæ°å¼u,v代表DCTåæ¢åç©éµå æ个æ°å¼çåæ ä½ç½®F(u,v)代表DCTåæ¢åç©éµå çæ个æ°å¼ u=0 ä¸ v=0 c(u)c(v)=1/1. u>0 æ v>0 c(u)c(v)=1 ç»è¿DCTåæ¢åçç©éµæ°æ®èªç¶æ°ä¸ºé¢çç³»æ°ï¼è¿äºç³»æ°ä»¥Fï¼0ï¼0ï¼çå¼æ大ï¼ç§°ä¸ºDCï¼å ¶ä½ç个é¢çç³»æ°åå¤åæ¯ä¸äºæ¥è¿äº0çæ£è´æµ®ç¹æ°ï¼ä¸æ¦ç§°ä¹ä¸ºACã 3ãéå å¾åæ°æ®è½¬æ¢ä¸ºé¢çç³»æ°åï¼è¿å¾æ¥åä¸é¡¹éåç¨åºï¼æè½è¿å ¥ç¼ç é¶æ®µãéåé¶æ®µéè¦ä¸¤ä¸ª8*8ç©éµæ°æ®ï¼ä¸ä¸ªæ¯ä¸é¨å¤ç亮度çé¢çç³»æ°ï¼å¦ä¸ä¸ªåæ¯é对è²åº¦çé¢çç³»æ°ï¼å°é¢çç³»æ°é¤ä»¥éåç©éµçå¼ï¼åå¾ä¸åæ°æè¿çæ´æ°ï¼å³å®æéåã å½é¢çç³»æ°ç»è¿éååï¼å°é¢çç³»æ°ç±æµ®ç¹æ°è½¬å为æ´æ°ï¼è¿æ便äºæ§è¡æåçç¼ç ãä¸è¿ï¼ç»è¿éåé¶æ®µåï¼æææ°æ®åªä¿çæ´æ°è¿ä¼¼å¼ï¼ä¹å°±å度æ失äºä¸äºæ°æ®å 容ï¼JPEGæä¾çéå表å¦ä¸ï¼ 4ãç¼ç Huffmanç¼ç æ ä¸å©æé®é¢ï¼æ为JPEGæ常ç¨çç¼ç æ¹å¼ï¼Huffmanç¼ç é常æ¯ä»¥å®æ´çMCUæ¥è¿è¡çã ç¼ç æ¶ï¼æ¯ä¸ªç©éµæ°æ®çDCå¼ä¸ä¸ªACå¼ï¼å°åå«ä½¿ç¨ä¸åçHuffmanç¼ç 表ï¼è亮度ä¸è²åº¦ä¹éè¦ä¸åçHuffmanç¼ç 表ï¼æ以ä¸å ±éè¦å个ç¼ç 表ï¼æè½é¡ºå©å°å®æJPEGç¼ç å·¥ä½ã DCç¼ç DCæ¯å½©éç¨å·®å¼èå²ç¼ç è°å¶çå·®å¼ç¼ç æ³ï¼ä¹å°±æ¯å¨åä¸ä¸ªå¾ååéä¸åå¾æ¯ä¸ªDCå¼ä¸åä¸ä¸ªDCå¼çå·®å¼æ¥ç¼ç ãDCéç¨å·®å¼èå²ç¼ç ç主è¦åå æ¯ç±äºå¨è¿ç»è²è°çå¾åä¸ï¼å ¶å·®å¼å¤åæ¯åå¼å°ï¼å¯¹å·®å¼è¿è¡ç¼ç æéçä½æ°ï¼ä¼æ¯å¯¹åå¼è¿è¡ç¼ç æéçä½æ°å°è®¸å¤ãä¾å¦å·®å¼ä¸º5ï¼å®çäºè¿å¶è¡¨ç¤ºå¼ä¸ºï¼å¦æå·®å¼ä¸º-5ï¼åå æ¹ä¸ºæ£æ´æ°5ï¼åå°å ¶äºè¿å¶è½¬æ¢æ1çè¡¥æ°å³å¯ãæè°1çè¡¥æ°ï¼å°±æ¯å°æ¯ä¸ªBitè¥å¼ä¸º0ï¼ä¾¿æ¹æ1ï¼Bit为1ï¼ååæ0ãå·®å¼5åºä¿ççä½æ°ä¸º3ï¼ä¸è¡¨å³ååºå·®å¼æåºä¿ççBitæ°ä¸å·®å¼å 容çå¯¹ç §ã å¨å·®å¼å端å¦å¤å å ¥ä¸äºå·®å¼çé夫æ¼ç å¼ï¼ä¾å¦äº®åº¦å·®å¼ä¸º5ï¼ï¼çä½æ°ä¸º3ï¼åé夫æ¼ç å¼åºè¯¥æ¯ï¼ä¸¤è è¿æ¥å¨ä¸èµ·å³ä¸ºãä¸åä¸¤ä»½è¡¨æ ¼åå«æ¯äº®åº¦åè²åº¦DCå·®å¼çç¼ç 表ãæ ¹æ®è¿ä¸¤ä»½è¡¨æ ¼å 容ï¼å³å¯ä¸ºDCå·®å¼å ä¸é夫æ¼ç å¼ï¼å®æDCçç¼ç å·¥ä½ã ACç¼ç ACç¼ç æ¹å¼ä¸DCç¥æä¸åï¼å¨ACç¼ç ä¹åï¼é¦å å¾å°ä¸ªACå¼æZig-zagæåºï¼å³æç §ä¸å¾ç®å¤´ææ示ç顺åºä¸²èèµ·æ¥ã å ¨æåèï¼ /question/.html
令人拍案叫绝的JPEG图像压缩原理
JPEG图像压缩原理详解
在数字化世界里,我们广泛应用各种图像格式,如JPEG、PNG等。尽管文件大小不同,但视觉效果相差不大。这背后隐藏的是数据压缩技术,尤其是JPEG压缩。让我们一起探索这个技术背后的奥秘。 图像由RGB三通道构成,每个像素由8位表示,但通过色彩空间转换(RGB->YCrCb)和色彩下采样,可以利用人类对亮度敏感度高于色彩的特点,将图像压缩。例如,将2K分辨率图像进行8x8的下采样,能节省存储空间。 接着,DCT变换(离散余弦变换)是关键步骤。它识别图像中高低频信息,低频信息对视觉影响较小,可以被保留,而高频信息可以舍弃。JPEG算法使用8x8像素组进行DCT变换,然后量化这些系数,根据视觉敏感度调整量化值,以减少信息损失。 最后,通过游程编码和霍夫曼编码进一步压缩,将数据变得更加紧凑。整个过程,从RGB转换、色彩下采样到DCT处理和编码策略,都是为了实现高效、有效的图像压缩,使得视觉效果几乎无损,但文件大小显著减少。JPEG编码原理
了解基本构成后,我们来深入探讨JPEG编码的工作原理。一张由像素矩阵组成,比如x的,包含个像素点。每个像素由RGB三个分量决定颜色,用1字节表示,能呈现种颜色。但这种直接存储方式占用大量空间,因此引入JPEG压缩技术。
JPEG的核心是将RGB色彩模型转换为YCbCr模型,Y表示亮度,Cb和Cr代表色彩偏差。人眼对亮度变化敏感,对色彩偏差相对不敏感。因此,通过损失CbCr分量中的冗余信息,同时保持Y分量的完整性,可以实现有损压缩。RGB到YCbCr的转换有助于后续的DCT(离散余弦变换)处理。
DCT将Y、Cb、Cr三个通道分别处理,将每个通道的个像素值转换为一组系数。原始数据的8x8矩阵被分割成多个小块(MCU),高频信息集中在右下角,低频信息在左上角。通过量化,我们丢弃高频部分,以减少存储需求。量化矩阵和量化操作的选择影响压缩率和图像质量。
接下来是Zig-Zag扫描,用于将量化后的一维数据整理,便于存储。游程编码(RLC)对扫描结果中的0进行压缩,通过编码表示连续的0数量,进一步减小数据量。最后,Huffman编码应用在游程编码后的数据上,根据数据出现概率选择不同长度的码字,提高编码效率。
解码时,JPEG遵循相反的流程,从HEADER解析开始,逐步还原图像数据。JPEG压缩和解压缩涉及复杂的算法和编码表,但通过这些步骤,我们能有效地在有限的存储空间内保存丰富的图像信息。