经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
JPG学习笔记4(附完整代码)
来源:cnblogs  作者:哇哩顾得  时间:2021/2/18 19:41:25  对本文有异议

  JPG编码的第3步是量化。对于经过离散余弦变化后的8*8block的数据,我们要对这8*8的数据进行量化。在JPEG中量化就是对数据V除以某个数Q,得到round(V/Q)代替原来的数据。然后在JPG解码的时候再乘以M得到V。

       需要注意的是,量化会丢失图片精度,而且是不可逆的。

       M的大小同时也影响压缩的效果。M越大压缩效果越好,但是图片精度损失越大。

图片引用自"Compressed Image File Formats JPEG, PNG, GIF, XBM, BMP - John Miano"[1]

1.JPEG的量化过程

首先我们会有一个8*8的量化表,这个表可以自定义,也可以用JPEG标准提供的量化表。

直接用我们的8*8的Block数据,除以对应的QuantizationTable的数据即可。

  1. const Block QUANTIZATION_TABLE_Y = {16, 11, 10, 16, 24, 40, 51, 61,
  2. 12, 12, 14, 19, 26, 58, 60, 55,
  3. 14, 13, 16, 24, 40, 57, 69, 56,
  4. 14, 17, 22, 29, 51, 87, 80, 62,
  5. 18, 22, 37, 56, 68, 109, 103, 77,
  6. 24, 35, 55, 64, 81, 104, 113, 92,
  7. 49, 64, 78, 87, 103, 121, 120, 101,
  8. 72, 92, 95, 98, 112, 100, 103, 99 };
  9. const Block QUANTIZATION_TABLE_CBCR = { 17, 18, 24, 47, 99, 99, 99, 99,
  10. 18, 21, 26, 66, 99, 99, 99, 99,
  11. 24, 26, 56, 99, 99, 99, 99, 99,
  12. 47, 66, 99, 99, 99, 99, 99, 99,
  13. 99, 99, 99, 99, 99, 99, 99, 99,
  14. 99, 99, 99, 99, 99, 99, 99, 99,
  15. 99, 99, 99, 99, 99, 99, 99, 99,
  16. 99, 99, 99, 99, 99, 99, 99, 99 };
量化表

 

 

假设我们的数据如左下,量化表如右下. 

 

 则round(V / A)就是我们需要的值了

 

2.代码

  1. void JPG::quantization() {
  2. for (uint i = 0; i < mcuHeight; i++) {
  3. for (uint j = 0; j < mcuWidth; j++) {
  4. MCU& currentMCU = data[i * mcuWidth + j];
  5. //iterate over 每一个component Y, cb cr
  6. for (uint componentID = 1; componentID <= 3; componentID++) {
  7. //遍历block
  8. for(uint ii = 0; ii < getVerticalSamplingFrequency(componentID); ii++) {
  9. for(uint jj = 0; jj < getHorizontalSamplingFrequency(componentID); jj++) {
  10. Block& currentBlock = currentMCU[componentID][ii * getHorizontalSamplingFrequency(componentID) + jj];
  11. const Block& quantizationTable = getQuantizationTableByID(componentID);
  12. //这一步就是对64个像素进行量化
  13. for(uint index = 0; index < 64; index++) {
  14. currentBlock[index] = currentBlock[index] / quantizationTable[index];
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

 以上全部的代码在https://github.com/Cheemion/JPEG_COMPRESS/tree/main/Day4

 完结

  Thanks for reading,

  Wish you have a good day.

                                                                                                                                                                                              >>>> JPG学习笔记5(待续)


 

参考资料

[1]https://github.com/Cheemion/JPEG_COMPRESS/blob/main/resource/Compressed%20Image%20File%20Formats%20JPEG%2C%20PNG%2C%20GIF%2C%20XBM%2C%20BMP%20-%20John%20Miano.pdf

原文链接:http://www.cnblogs.com/robsann/p/14399452.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号