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)

压缩比

黑历史

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

相关推荐
Gigavision42 分钟前
DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载
深度学习·算法·transformer
夜之眷属1 小时前
PriorityQueue:for-each 遍历和 poll 取出,顺序一样吗?
java·服务器·数据结构·后端·算法
地平线开发者2 小时前
不是线程越多越快:用 hrt_model_exec 在 征程6M 上给 YOLOv5x 建立性能基线
算法
姜鱼问生2 小时前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.2 小时前
华为题:全排列
算法·深度优先·图论
杜 硕3 小时前
快速排序详解01
数据结构·算法·排序算法
Matlab程序猿3 小时前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
信奥卷王3 小时前
[GESP202606 六级] 满二叉树
数据结构·算法
积流成海3 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站
Nil2083 小时前
leetcode 300最长递增子序列
算法·leetcode·职场和发展