JPEG有损图像压缩编码器(附源码)

概述

一个基本由自己实现的JPEG有损图像压缩编码器,基于JFIF(JPEG文件交换格式)标准:

  • 色彩空间转换(RGB to YUV)
  • 色度抽样(采样因子4:2:0)
  • MCU分块(16x16的最小编码单元,以Y1 Y2 Y3 Y4 U V的顺序写入比特流)
  • DCT离散余弦变换
  • 量化(基于50%压缩质量的亮度/色度量化表)
  • 熵编码
    • 游程编码(RLE编码)
    • 可变长整数编码(VLI编码)
    • 范式霍夫曼编码(基于JPEG官方推荐的四张范式霍夫曼表)
  • JPEG文件头构建及比特输出流写入

要注意的是,该项目并未完全实现JPEG编码器的全部功能,在这个项目中:

  • 文件的读入和RGB色彩空间的读取仍然是基于ImageIO库来实现的
  • 由范式霍夫曼表构建霍夫曼树参照了该项目目录下thirdparty/JpegEncoder.java的代码

此外:

  • 本项目仅实现了JFIF标准要求的基本压缩算法,JPEG还支持许多其他的压缩算法(如熵编码部分还可以采用算术编码等)
  • 本项目是基于SOF0(baseline基线式JPEG)的,此外还有一种SOF2(progressive渐进式JPEG)的编解码方式

详述

写完这个项目,感觉最难写的反而是熵编码部分,色彩空间转换、离散余弦变换、量化这三步在中文互联网上已经有足够详细的介绍了,也有现成的公式可以套用,但是分块(MCU)这一点很多资料都没有提及到,这直接关系到最后写入比特流时的编码顺序问题,而熵编码部分同样有大量细节没有阐述,这一步骤三种编码方式结合在一起而且压缩后的数据流过于抽象难以调试纠错。

看到中文互联网上的JPEG编码教程大多漏过了许多细节,打算写一篇尽可能详细的文章来帮助后人避免踩同样的坑。

JPEG编码过程详解

展示

原图(knowledge.bmp)

输出图(out.jpg)

压缩比

黑历史

一些在熵编码步骤遇到的各种神必输出图

相关推荐
什巳6 小时前
JAVA练习309- 二叉树的层序遍历
java·数据结构·算法·leetcode
什巳9 小时前
JAVA练习306- 翻转二叉树
java·数据结构·算法·leetcode
smj2302_796826529 小时前
解决leetcode第3989题网格中保持一致的最大列数
python·算法·leetcode
巧克力男孩dd10 小时前
Python超典型练习题(第一次作业)
开发语言·python·算法
爱刷碗的苏泓舒10 小时前
平方根信息滤波:矩阵推导及 GNSS 参数估计应用
线性代数·算法·矩阵·gnss·参数估计·测量平差·平方根信息滤波
想做小南娘,发现自己是女生喵11 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
艾醒12 小时前
2026年第29周(7.13-7.19)AI全复盘:技术突破、行业趣闻翻车、算力服务器商业动态
人工智能·算法
雪碧聊技术12 小时前
动态规划算法—01背包问题
算法·动态规划
bu_shuo12 小时前
c与cpp中的argc和argv
c语言·c++·算法
普贤莲花12 小时前
【2026年第29周---写于20260718】---整理,断舍离
程序人生·算法·生活