JPEG圖像原理與應用
? 基本概念
JPEG(Joint Photographic Experts Group)指的是聯合圖像專家組,是國際標準化組織ISO制訂并于1992年發布的一種面向連續色調靜止圖像的壓縮編碼標準,所以也被稱為JPEG標準。
同樣,JPEG也是一種常用的圖像存儲格式,JPEG的文件格式有兩種文件擴展名:.jpg和.jpeg,這兩種擴展名是相同的,我們可以把.jpg的文件改名為.jpeg,而對文件本身不會有任何影響。
和其他相同圖像質量的文件格式相比,JPEG格式的壓縮比是最高的,也就是說在圖像質量相差不大的情況下,JPEG文件所占的內存更小。所以JPEG圖像一般適合進行網絡傳輸。
? 編解碼庫
由于JPEG格式的文件是經過壓縮的,所以用戶無法向訪問BMP位圖一樣直接讀取JPEG文件中的內容,而是需要使用對應的libjpeg解碼庫對JPEG文件進行解碼,從而得到解碼之后的RGB顏色分量,然后把解碼之后的RGB顏色分量寫入到LCD屏即可。
libjpeg是一款開源的JPEG圖像庫,可以用于編碼JPEG文件格式或者用于解碼JPEG文件格式,這套庫是由IJG(Independent JPEG Group)獨立小組進行維護與發布,libjpeg庫完全利用C語言設計并且內部集成各種用于編解碼算法的函數接口,廣泛用于各種圖像處理,比如OpenCV(開源的跨平臺計算機視覺庫)讀取圖像的底層實現邏輯就是基于libjpeg庫的。
由于IJG獨立小組不屬于官方組織,也就是說libjpeg庫不屬于標準庫,而屬于第三方庫,所以Linux系統并沒有直接為用戶安裝libjpeg庫,用戶如果打算使用libjpeg庫就需要完成庫的移植工作。
? 庫的移植
(1) 下載需要移植的庫的源碼包,libjpeg庫源碼包在官網可以下載 www.ijg.org,如圖所示
(2) 解壓壓縮包,解壓后找到自述文件README,打開README了解libjpeg庫的使用規則!
(3) 打開源碼包中的install.txt的文本,學習libjpeg庫的移植和安裝的步驟,移植libjpeg的步驟分為三步:配置(./configure) + 編譯(make) + 安裝(make install)。
(4) 把下載好的源碼包jpegsrc.v9f.tar.gz發送到linux系統的家目錄下進行解壓,注意不可以在共享文件夾進行解壓
(5) 切換到解壓后的jpeg-9f的文件夾內,然后輸入指令配置libjpeg庫,配置的時候需要使用一個叫做configure的配置文件,該配置文件有兩個選項非常重要:–prefix 和 --host
(6) 配置成功之后,會得到一個makefile腳本文件,此時可以完成移植的第二步:編譯,在命令行輸入指令:make ,該指令會自動執行makefile
(7) 編譯通過之后,則可以完成libjpeg庫的安裝,此時在命令行輸入指令: make install
(8) 安裝完成后,可以在用戶指定的安裝路徑中找到生成的libjpeg庫的頭文件和庫文件,此時用戶可以選擇拷貝出來,就可以設計程序時使用。
(9) 把include文件夾和lib文件夾與自己的工程文件放在同一個路徑,方便后期的工程維護!
? 庫的使用
為了可以把一張jpg圖片顯示在LCD上,所以需要把jpg圖片進行解壓,解壓之后就可以得到圖片內部的像素點的顏色分量,就可以把像素點的顏色分量向LCD的像素點寫入。就需要掌握jpg圖片的解壓流程(背下來)。
? 解碼流程
(1) 創建解碼對象,并且對解碼對象進行初始化,另外需要創建錯誤處理對象,并和解碼對象進行關聯。
(2) 打開待解碼的jpg圖片,使用fopen的時候需要添加選項”b”,以二進制方式打開文件!
(3) 讀取待解碼圖片的文件頭,并把圖像信息和解碼對象進行關聯,通過解碼對象對jpg圖片進行解碼
(4) 可以選擇設置解碼參數,如果打算以默認參數對jpg圖片進行解碼,則可以省略該步驟!
(5) 開始對jpg圖片進行解碼,調用函數之后開始解碼,可以得到圖像寬、圖像高等信息!
(6) 開始設計一個循環,在循環中每次讀取1行的圖像數據,并寫入到LCD中,注意:轉換算法需要用戶自己設計。
(7) 在所有的圖像數據都已經解碼完成后,則調用函數完成解碼即可,然后釋放相關資源!
? 程序設計
? 程序編譯
由于libjpeg庫不是直接安裝在Linux系統下,這個libjpeg庫是拷貝出來,所以在Linux系統路徑下是找不到libjpeg的頭文件和庫文件的,所以在編譯程序的時候需要使用編譯器的選項: -I 指定頭文件的路徑 -L 指定庫文件的路徑 -l 指定庫文件的名稱(lib縮寫)
? 下載調試
注意:編譯通過的可執行文件是需要在6818開發板上進行執行,所以在6818開發板上運行程序的時候是需要調用libjpeg庫文件,所以需要確保在開發板的Linux系統中的 /lib目錄下要有libjpeg.so.9庫文件存在,程序運行才不會報錯。