TJpgDec—輕量級JPEG解碼器
本文由烏合之眾lym瞎編,歡迎轉載blog.cnblogs.net/oloroso
下文中解碼一詞皆由decompression/decompress
翻譯而來。
TJpgDec是一個為小型嵌入式系統高度優化的創建JPEG圖像的解碼模塊。它工作時占用的內存非常低,以便它可以集成到微控芯片,如AVR, 8051, PIC, Z80, Cortex-M0等。
特性
- 平臺獨立。使用ANSI-C編寫
- 易于使用的主操作模式
完全可重入的體系結構
Very small memory footprint:
非常小的內存占用
獨立于圖像尺寸的3K工作內存。
3.5-8.5KB的文本和常數ROM.輸出格式:
縮放比例:1/1、1/2、1/4或1/8可選。
像素格式:RGB888或RGB565預配置。
API接口
有兩個函數用于分析和解碼JPEG圖像。
jd_prepare
jd_prepare
- 準備解碼JPEG圖像
jd_prepare
分析JPEG數據并創建一個解碼對象(decompression object)用于隨后的解碼過程。
JRESULT jd_prepare (JDEC* jdec, /* Pointer to blank decompression object */UINT(*infunc)(JDEC*,BYTE*,UINT), /* Pointer to input function */void* work, /* Pointer to work area */UINT sz_work, /* Size of the work area */void* device /* Device identifier for the session */);
參數
jdec
指定解碼對象去初始化。這個解碼對象是用于后續的解碼操作。
input
指定用戶定義的數據輸入函數。
jd_prepare
和jd_decomp
調用這個函數來從輸入流讀取JPEG數據.work
指向此會話工作區域的指針。它應該與word邊界對齊或者它可以導致一個異常。
sz_work
指定工作區域的字節數。TJpgDec至多需要3092字節的工作區域,這依賴于JPEG圖像的內置參數表。通常情況下是3092字節工作區域.
device
指定用戶定義的會話設備標識。它保存在解碼對象的
device
成員中。它可以用于I/O
函數去識別當前會話。當I/O device
固定在project或者不需要這個功能,設置為NULL并忽略它。
返回值
JDR_OK
Function succeeded and decompression object is valid.
函數執行成功,且編碼對象是有效的。JDR_INP
An error occured in input function due to hard error or wrong stream termination.
一個錯誤發生在input函數,由于硬件錯誤或者流終止。JDR_MEM1
Insufficient work area for this JPEG image.
工作區域不足解碼這個JPEG圖像。JDR_MEM2
Insufficient input buffer for this JPEG image. JD_SZBUF may be too small.
輸入緩沖器不足讀取這個JPEG圖像,JD_SZBUF可能過小。JDR_PAR
Parameter error. Given pointer to the work area is NULL.
參數錯誤。傳入的工作區指針為NULL。JDR_FMT1
Data format error. The JPEG data can be collapted.
數據格式錯誤。JPEG數據損壞。JDR_FMT2
Right format but not supported. May be a grayscale image.
格式正確,但不支持。也許是一個灰度圖像。JDR_FMT3
Not supported JPEG standard. May be a progressive JPEG image.
不支持JPEG標準,也許是一個先進的JPEG圖像。
描述
jd_prepare
函數是JPEG解碼會話的第一階段。它分析JPEG圖像和創建解碼參數表。函數成功后,會話準備好在jd_decomp
函數解碼JPEG圖像。應用程序可以參考JPEG解碼對象中存儲的尺寸大小。這個信息將用于在后續的解碼階段配置輸出設備(device)和參數。
jd_decomp
jd_decomp
- 執行解碼JPEG圖像
jd_decomp
函數解碼JPEG圖像并輸出RGB
數據。
JRESULT jd_decomp (JDEC* jdec, /* Pointer to valid decompressor object */UINT(*outfunc)(JDEC*,void*,JRECT*), /* Pointer to output function */BYTE scale /* Scaling factor */);
參數
jdec
指定有效的解碼對象。
outfunc
指定用戶定義的輸出函數。
jd_decomp
調用這個函數去輸出解碼JPEG圖像的RGB形式。scale
指定輸出比例因子N。輸出圖像的縮小比例為
1/2^N
(N = 0 to 3)。當縮放功能禁用時(JD_USE_SCALE == 0),它必須是0.
返回值
JDR_OK
Function succeeded.
函數執行成功。JDR_INTR
The decompression process is interrupted by output function.解碼過程在輸出函數中斷。
JDR_INP
An error occured in input function due to hard error or wrong stream termination.
一個錯誤發生在input函數,由于硬件錯誤或者流終止。JDR_PAR
Parameter error. Given scale factor is invalid.
參數錯誤。給定的縮放值無效。JDR_FMT1
Data format error. The JPEG data can be collapted.
數據格式錯誤。JPEG數據損壞。
描述
jd_decomp
是JPEG解碼會話的第二階段。它解碼JPEG圖像并通過用戶定義的輸出函數輸出數據,在它之后,解碼對象將不在有效。
在解碼時指定的比例因子,它將JPEG圖像按1/2、1/4或1/8比例縮放尺寸。例如,當解碼一個1024x768大小JPEG圖像在1/4比例,它將輸出256x192大小。相比不縮放,1/2和1/4的縮放由于求均值,解碼速度略有下降。但是1/8縮放相比不縮放是2-3倍的速度輸出,因為每個塊IDCT和求均值可以跳過。這一特點適合創建縮略圖。
I/O函數
輸入JPEG數據并輸出解碼后像素,TJpgDec需要用戶定義兩個I/O
函數
Input Function
Input funciotn
- 從輸入流讀取JPEG數據
用戶定義的從輸入流讀取數據的輸入函數。
UINT in_func (JDEC* jdec, /* Pointer to the decompression object */BYTE* buff, /* Pointer to buffer to store the read data */UINT ndata /* Number of bytes to read */);
參數
jdec
指定解碼會話的解碼對象。
buff
指定讀緩沖器去保存讀取數據。傳入NULL將數據從輸入流移除。
ndata
指定從輸入流讀取或移除的字節數。
返回值
返回讀取或移除的字節數。若返回0,jd_prepare
和jd_decomp
函數將終止并返回JDR_INP
。
描述
這個函數是TJpgDec模塊的數據輸入接口。可以通過指向設備標識符的指針來標識相應的解碼會話。
Output Function
Output function
- 寫像素數據到輸出設備
用戶定義的輸出函數,寫解碼像素到輸出設備。
UINT out_func (JDEC* jdec, /* Pointer to the decompression object */void* bitmap, /* RGB bitmap to be output */JRECT* rect /* Rectangular region to output */);
參數
jdec
指定會話的解碼對象。
bitmap
指定RGB位圖(bitmap)用于輸出。
rect
指定在圖像中的矩形區域去輸出RGB位圖。
返回值
通常返回1,以便TJpgDec繼續解碼過程。當它返回0,jd_decomp
函數終止并返回JDR_INTR
,這在中斷減壓過程中有用。
描述
這個函數是TJpgDec模塊的數據輸出函數。可以通過指向設備標識符的指針來標識相應的解碼會話,jdec->device
通過jd_prepare
函數第五個參數確定。
在這個函數中,位圖發送到幀緩沖或顯示設備。第一個像素是位圖矩形的左上角位置,最后一個像素是右下角位置。矩形的大小從1x1
到16x16
取決于圖像的裁剪、縮放和采樣因子。如果矩形是幀緩沖區,它將在函數中倍裁剪。
像素格式取決于JD_FORMAT
參數的配置選項。當它配置為RGB888
,位圖是一個字節數組,每3個字節保存一個RGB像素:RRRRRRRR, GGGGGGGG, BBBBBBBB, RRRRRRRR, GGGGGGGG, BBBBBBBB, ...
;配置為RGB565
時,位圖是一個WORD
數組,RGB數據1word每像素:RRRRRGGGGGGBBBBB, RRRRRGGGGGGBBBBB, RRRRRGGGGGGBBBBB, ...
。
資源
TJpgDec是一個免費軟件,對教育、研究和開發開發。你可以使用、修改和重新分發它,對個人項目或商業產品沒有任何限制和責任。
- 先讀: TJpgDec 應用筆記2012年8月13日
- 下載: TJpgDec R0.01b 2012年9月3日
- 下載: TJpgDec 示例項目 (AVR, PIC24, LPC1114 and Win32)2012年2月19日
- 演示短片(MP4/3MB)