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手机,压缩源码系统内部的压缩源码车载音效源码压缩算法并未采用全速的哈夫曼编码,因为这会占用过多CPU资源。压缩源码本文将采用Cmake工具编译libJPEG-turbo源码,压缩源码并利用JNI/NDK技术,压缩源码定制哈夫曼编码接口,压缩源码提升Android中的压缩源码压缩性能。
哈夫曼编码是压缩源码一种高效的无损压缩方式,它根据字符出现概率分配不同长度的压缩源码码字,出现频率高的压缩源码字符编码较短。在图像压缩中,压缩源码通过扫描图像数据确定像素概率,构造赫夫曼树,充值水卡 源码生成对应码表。例如,构建一颗赫夫曼树,其带权路径长度可通过叶子结点的权重和路径长度计算得出。
在libjpeg库中,压缩JPEG过程涉及分配结构体、设置输出、参数设置、按行处理数据等步骤。而解码则包括初始化对象、指定数据源、读取头部参数和解压数据等操作。源码分析显示,压缩和解压的核心结构体包含图像信息、参数配置和工作空间指针等关键部分。
要编译移植libjpeg-turbo,保护网站源码首先在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),是.net源码如何使用指将一组光强数据转换成频率数据,以便得知强度变化的情形。
三、量化: 图像数据转换为频率系数后,还得接受一项量化程序,才能进入编码阶段。
四、编码: 1、编码 Huffman编码无专利权问题,成为JPEG最常用的编码方式,Huffman编码通常是以完整的MCU来进行的。 编码时,每个矩阵数据的DC值与个AC值,将分别使用不同的Huffman编码表,而亮度与色度也需要不同的Huffman编码表,所以一共需要四个编码表,才能顺利地完成JPEG编码工作。资金净额流入源码
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压缩和解压缩涉及复杂的算法和编码表,但通过这些步骤,我们能有效地在有限的存储空间内保存丰富的图像信息。