这个系列的最后,我提供给大家一个简易的jpeg压缩算法的代码,这份代码用C++编写,以开源方式提供,放在了github上,可以到下面这个网址下载
http://github.com/thejinchao/jpeg_encoder |
---|
使用方法很简单,像下面这样就可以了
#include "jpeg_encoder.h"
JpegEncoder encoder;
//输入的文件必须是24bit的bmp文件,尺寸必须是8的倍数
encoder.readFromBMP(inputFileName);
//第二个参数在1~199之间,代表文件压缩程度,数字越大,压缩后的文件体积越小
encoder.encodeToJPG(outputFileName, 50);
JpegEncoder encoder;
//输入的文件必须是24bit的bmp文件,尺寸必须是8的倍数
encoder.readFromBMP(inputFileName);
//第二个参数在1~199之间,代表文件压缩程度,数字越大,压缩后的文件体积越小
encoder.encodeToJPG(outputFileName, 50);
这份代码只是为了配合这个系列的文章,所以没有考虑优化,如果你想在实际工程中使用jpeg的压缩算法,还是使用被广泛应用的libjpeg或者OpenJpeg。
参考资料:
【1】http://www.impulseadventure.com/photo/jpeg-huffman-coding.html
【2】http://www.mysanco.cn/index.php?class=wenku&action=wenku_item&id=96
【3】http://www.codingnow.com/2000/download/jpeg.txt
【4】http://jingyan.baidu.com/article/cbf0e500f1ce562eaa2893f4.html
【5】http://www.codeproject.com/Articles/83225/A-Simple-JPEG-Encoder-in-C
以前在大学里的时候也写过:) https://code.google.com/p/jpeg-decoder/
感谢作者!写得很棒,花了不少精力,好人一生平安!
非常感谢您! 思路清晰,受益匪浅。
感谢作者的精心分享与写作!
感谢作者?
太感谢您了!受益匪浅!
你好,假如图片尺寸不是8X8的倍数,具体怎么处理呢,是需要补充吗?
应该是扩充到8的倍数
你好,使用时我还是有点问题,导入bmp文件需要导入文件路径吗,
多谢作者分享,受益匪浅
您好,代码的这个是不是有点问题呢?初始化table的时候
int temp = ((int)(Luminance_Quantization_Table[ZigZag[i]] * quality_scale + 50) / 100);
if (temp0xFF) temp = 0xFF;
m_YTable[ZigZag[i]] = (unsigned char)temp;
temp = ((int)(Chrominance_Quantization_Table[ZigZag[i]] * quality_scale + 50) / 100);
if (temp0xFF) temp = 0xFF;
m_CbCrTable[ZigZag[i]] = (unsigned char)temp;