时至今日,我想JPEG(1992)应该是有损压缩图片编码格式里最最简单的一个吧。
有多简单呢,如果用代码量来看的话,网上开源的TinyJPEG项目,即使算上代码注释,总共也只有1283行代码。
它的项目地址在:
https://github.com/serge-rgb/TinyJPEG
具体代码这里就不贴了,感兴趣的话可以看看。我试过了,这个代码可以编出标准JPEG格式图片。
这个项目里只有一个.h文件,所以需要自己写一个demo.c,大概像下面这样:
然后编译:gcc -o jpeg_enc demo.c -I ./tiny_jpeg.h
得到可执行程序jpeg_enc。此程序支持输入常见的图片格式,比如JPEG,BMP和PNG等。
最后运行命令./jpeg_enc cheers.png 90得到quality为90的JPEG图片,如下图右边所示,左图是输入PNG图片。
设置的quality是90,对应到代码里面是对量化值进行缩放的系数。
tjei_default_qt_luma_from_spec在这里具体是什么呢?
其实就是JPEG图片的基础量化表,一共有2张。分别是亮度分量量化表和色度分量量化表。两张表的大小都是8×8,共64个量化系数。Independent JPEG Group (IJG) 提供的量化表是下面的值(并不属于JPEG标准,但是广泛使用)
可以看到,量化值都是左上角到右下角逐渐增大,且相同位置的色度分量的量化值比亮度分量大,这个也容易理解吧。
JPEG格式虽然简单,但分块编码,DCT变换,量化编码和熵编码这些后续一直沿用的基本编码工具和技术却都有。
在实际的业务和常见的软件工具中,jpeg编码器开源项目中最为经典的是libjpeg-turbo。令人唏嘘的是,在今年7月该项目开发人员宣布由于资金短缺,该编码器后续将进入”维护模式”。
作者:codec2021
来源:手撕编解码
原文:https://mp.weixin.qq.com/s/YmNvqjjMfX6F6D7ajecfJQ
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。