在使用libjpeg库把yuv编成jpeg的时候发现,如果想要编出来的图片和实际yuv是水平镜像,那就需要进行像素级copy。效率比较低,而使用的场景是在嵌入式设备上,性能较弱。所以需要修改libjpeg实现编码的时候水平镜像。
jpeg的编码原理可以从这个链接了解 https://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html
水平镜像:从原来左→右编码改成从右→左编码。由于jpeg编码原理分块编码的。在做FDCT之前会先分成8x8的宏块,然后送去做DCT变换。所以第一步是修改送去做DCT的循序。从
顺序变换到
需要注意的是jpeg_write_raw_data是读取整行的数据,在这里无法对编码宏块顺序进行控制,需要在下面几个地方修改:
1、由于yuv亮度采样系数我设置的是2,所以送到forword_dct的宏块各式如下:
所以在do_dct之前,会进一步的划分宏块。所以改变do_dct的传参,让它先从4开始编第一个宏块。
2、修改dct运算,jpeg使用的是快速dct,用的是蝶形算法,其中只涉及了加减运算,所以只要交换运算符的前后项就行了。
dct公式推导过程可以从这个链接了解https://www.cnblogs.com/xkfz007/archive/2012/07/31/2616791.html
成
这样,做完dct之后,还要进行zig-zag扫描,由于扫描的是昨晚dct变化后的数,所以不需要我们另外修改。
旋转180°的修改方法:
选择180°可以拆分成水平镜像和倒影。我们采取从文件反向读取,直到第一行,然后加上水平镜像的修改,就可以实现了
修改后的代码:
https://github.com/846772963/libjpeg.git
未修改的源代码:
http://www.ijg.org/files/jpegsrc.v9c.tar.gz