天天看點

修改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的循序。從

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

順序變換到

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

需要注意的是jpeg_write_raw_data是讀取整行的資料,在這裡無法對編碼宏塊順序進行控制,需要在下面幾個地方修改:

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

1、由于yuv亮度采樣系數我設定的是2,是以送到forword_dct的宏塊各式如下:

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

是以在do_dct之前,會進一步的劃分宏塊。是以改變do_dct的傳參,讓它先從4開始編第一個宏塊。

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

2、修改dct運算,jpeg使用的是快速dct,用的是蝶形算法,其中隻涉及了加減運算,是以隻要交換運算符的前後項就行了。

dct公式推導過程可以從這個連結了解https://www.cnblogs.com/xkfz007/archive/2012/07/31/2616791.html

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果
修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

修改libjpeg實作水準鏡像,倒影和旋轉180°的效果

這樣,做完dct之後,還要進行zig-zag掃描,由于掃描的是昨晚dct變化後的數,是以不需要我們另外修改。

旋轉180°的修改方法:

選擇180°可以拆分成水準鏡像和倒影。我們采取從檔案反向讀取,直到第一行,然後加上水準鏡像的修改,就可以實作了

修改後的代碼:

https://github.com/846772963/libjpeg.git

未修改的源代碼:

http://www.ijg.org/files/jpegsrc.v9c.tar.gz

繼續閱讀