修改libjpeg实现水平镜像,倒影和旋转180°的效果

       在使用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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值