ARM開發(fā)板多媒體實驗-3、JPEG解碼顯示_第1頁
ARM開發(fā)板多媒體實驗-3、JPEG解碼顯示_第2頁
ARM開發(fā)板多媒體實驗-3、JPEG解碼顯示_第3頁
ARM開發(fā)板多媒體實驗-3、JPEG解碼顯示_第4頁
ARM開發(fā)板多媒體實驗-3、JPEG解碼顯示_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

jpeg圖片解碼顯示丁建明華嵌教育教學(xué)目標(biāo)了解libjpeg

libjpeg庫是專門用于jpeg圖片格式解壓和壓縮的庫解壓jpeg圖片,并顯示到LCD屏上jpeg介紹JPEG是JointPhotographicExpertsGroup(聯(lián)合圖像專家小組)的縮寫。JPEG的壓縮方式通常是破壞性資料壓縮(lossycompression),意即在壓縮過程中圖像的品質(zhì)會遭受到可見的破壞。稱為有損壓縮。JPEG格式壓縮的主要是高頻信息,對色彩的信息保留較好,適合應(yīng)用于互聯(lián)網(wǎng),可減少圖像的傳輸時間,支持24bit真彩色,也普遍應(yīng)用于需要連續(xù)色調(diào)的圖像。libjpeg簡介libjpeg是一個完全用C語言編寫的庫,包含了被廣泛使用的JPEG解碼、JPEG編碼和其他的JPEG功能的實現(xiàn)。這個庫由獨立JPEG工作組維護(hù)。最新版本號是6b,于1998年發(fā)布。在libjpeg中,圖像數(shù)據(jù)是以掃描線的形式存放的。每一條掃描線由一行像素點構(gòu)成,像素點沿著掃描線從左到右依次排列。對于彩色圖像,每個分量由三個字節(jié)組成,因此這三個字節(jié)以R、G、B的順序構(gòu)成掃描線上的一個像素點。一個典型的掃描線形式如下:R,G,B,R,G,B,R,G,B,…通過libjpeg解壓出來的圖像數(shù)據(jù)也是以掃描線的形式存放的。jpeg解碼顯示流程初始化顯示設(shè)備打開圖像文件設(shè)置出錯處理函數(shù)分配并初始化一個JPEG解壓對象指定要解壓縮的圖像文件獲取圖像信息開始解壓為解壓后的掃描線上的所有像素點分配空間循環(huán)讀取一行并顯示到液晶屏上結(jié)束解碼釋放解碼對象關(guān)閉文件解除顯存映射,關(guān)閉顯示設(shè)備文件jpeg解碼顯示流程圖需要用到的頭文件#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<sys/types.h>#include<linux/fb.h> //framebuffer頭文件#include<sys/mman.h> //內(nèi)存映射頭文件#include<jpeglib.h> //libjpeg頭文件#include<jerror.h> //libjpeg錯誤處理頭文件jpeg解碼顯示具體流程1、初始化顯示設(shè)備

具體查看framebuffer操作流程2、打開一個jpeg圖像文件3、設(shè)置默認(rèn)的出錯信息注:在libjpeg庫中,實現(xiàn)了默認(rèn)錯誤處理函數(shù),當(dāng)錯誤發(fā)生時,比如如果內(nèi)存不足等,則默認(rèn)錯誤處理函數(shù)將會調(diào)用exit函數(shù)結(jié)束整個進(jìn)程FILE*infile=fopen(“picture.jpeg”,“r”);structjpeg_error_mgrjerr;cinfo.err=jpeg_std_error(&jerr);jpeg解碼顯示具體流程4、分配并初始化一個JPEG解壓對象

5、指定要解壓縮的圖像文件

6、獲取圖像信息,調(diào)用結(jié)束后cinfo結(jié)構(gòu)體中已填充圖片信息

7、開始解碼structjpeg_decompress_structcinfo;jpeg_create_decompress(&cinfo);jpeg_stdio_src(&cinfo,infile);jpeg_read_header(&cinfo,TRUE);jpeg_start_decompress(&cinfo);jpeg解碼顯示具體流程structjpeg_decompress_structcinfo中所需要用到的成員參數(shù):

cinfo.output_height :掃描線的總數(shù) cinfo.output_width :圖像輸出的寬度

cinfo.output_components:每個像素的分量數(shù)也稱字節(jié)數(shù)jpeg解碼顯示具體流程8、為解壓后的掃描線上的所有像素點分配空間注:開始解壓后往往需要為解壓后的每一條掃描線上的所有像素點分配存儲空間,這個空間的大小可以通過output_wight*output_componets確定。

char*buffer=(unsignedchar*)malloc(cinfo.output_width* cinfo.output_components);jpeg解碼顯示具體流程9、循環(huán)讀取一行并顯示到液晶屏上

對掃描線的讀取是按照從上到下的順序進(jìn)行的,也就是說圖像最上方的掃描線最先被jpeg_read_scanlines()讀入存儲空間中,緊接著是第二個掃描線,最后是圖像底邊的掃描線被讀入存儲空間中。inty=0;while(cinfo.output_scanline<cinfo.output_height){ //讀取一行并顯示 jpeg_read_scanlines(&cinfo,&buffer,1); //讀取一行像素點 unsignedshortcolor; for(x=0;x<cinfo.output_width;x++){ color=RGB888toRGB565(buffer[x*3], buffer[x*3+1],buffer[x*3+2]); fb_pixel(x,y,color); //顯示一個像素點

} y++;}jpeg解碼顯示流程RGB888轉(zhuǎn)RGB565 如果所用的Framebuffer設(shè)備的顏色深度為16位,顏色格式為5-6-5格式——即R(紅色)在16bit中占據(jù)高5位,G(綠色)在16bit中占據(jù)中間6位,B(藍(lán)色)在16bit中占據(jù)低5位;而libjpeg解壓出來的圖像數(shù)據(jù)為24位RGB格式,因此必須進(jìn)行轉(zhuǎn)換。對于24位的RGB,每個字節(jié)表示一個顏色分量,因此轉(zhuǎn)換的方式為:對于R字節(jié),右移3位,對于G字節(jié),右移2位,對于B字節(jié),右移3位,然后將右移得到的值拼接起來,就得到了16位的顏色值unsignedshortRGB888toRGB565(unsignedcharred, unsignedchargreen,unsignedcharblue){unsignedshortB=(blue>>3)&0x001F;unsignedshortG=((green>>2)<<5)&0x07E0;unsignedshortR=((red>>3)<<11)&0xF800;return(unsignedshort)(R|G|B);}jpeg解碼顯示流程10、結(jié)束解碼

11、釋放解碼對象12、釋放為解壓后的掃描線上的所有像素點分配空間

13、關(guān)閉文件jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);free(buffer);fclose(infile);jpeg解碼顯示流程14、解除顯存映射,關(guān)閉顯示設(shè)備文件

具體看framebuffer

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論