linux系統lcd顯示jpg格式圖片

有沒有好聽的暱稱zzzzz發表於2020-09-28

#include “myhead.h”//自定義的標頭檔案
int main(int argc,char *argv[])//主函式傳參
{
FILE *fp;//
int fd;
//struct fb_var_screeninfo screeninfo;//宣告一個與螢幕資訊相關的結構體物件
//int screenWidth,screenHeight;
//int bytesperpixel;

unsigned char *pLineColor;//指向開闢的存放一行畫素資訊的地址
unsigned int *pFrameBuffer;//指向記憶體對映
int image_width,image_height;//讀取圖片的高度和寬度

//宣告一個jpeg解壓物件
struct jpeg_decompress_struct dinfo;

//把jpeg的出錯資訊關聯到程式的標準錯誤裝置上,除非你不關心jpeg庫的出錯資訊
struct jpeg_error_mgr err;
dinfo.err=jpeg_std_error(&err);

//建立一個jpeg解壓物件
jpeg_create_decompress(&dinfo);

if(argc<2)
{
    printf("Usage:digitalPhoto  jpeg_filename.\n");
    return -1;
}
fp=fopen(argv[1],"r");//只讀方式開啟圖片
if(fp==NULL)
{
    perror("Cannot open jpeg_file");
    goto exit;
}

//將jpeg解壓物件和jpeg檔案流關聯起來,意味這jpeg解壓物件將從檔案流中獲取資料
jpeg_stdio_src(&dinfo,fp);

//獲取頭部資訊
jpeg_read_header(&dinfo,TRUE);
image_height=dinfo.image_height;//獲取圖片高度
image_width=dinfo.image_width;//獲取圖片寬度
				//dinfo.num_components 是解壓還原後每個畫素點的顏色位元組數
printf("w=%d,h=%d,num=%d\n",image_width,image_height,dinfo.num_components);

//開啟LCD
fd=open("/dev/fb0",O_RDWR);
//ioctl(fd,FBIOGET_VSCREENINFO,&screeninfo);//獲取LCD的寬高等資訊
//screenWidth=screeninfo.xres;//獲取螢幕的寬
//screenHeight=screeninfo.yres;//獲取螢幕的高
//bytesperpixel=screeninfo.bits_per_pixel/8;//獲取每個畫素顏色所佔的位元組數

pFrameBuffer=(unsigned int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//記憶體對映
dinfo.scale_num = 1;  //
dinfo.scale_denom = 1; //顯示圖片比例為1:1

//開始解壓
jpeg_start_decompress(&dinfo);

//申請一個儲存jpeg一行顏色資料的緩衝區  圖片每個畫素點佔三個位元組
pLineColor=(unsigned char*)malloc(image_width*dinfo.num_components);

//按行讀取jpeg圖片的資料並處理
while(dinfo.output_scanline<dinfo.output_height && dinfo.output_scanline<480)	//output_scanline從0開始,表示讀行數 小於圖片高度和lcd高度
									//每讀取一行,output_scanline自動+1
{
    int col;
    unsigned char *pTmpColor=pLineColor;// 申請一個char指標指向申請的堆空間
    unsigned char red,green,blue;//申請三個位元組存放每個畫素點的RGB資訊

    //讀取一行 申請一個char指標指向申請的堆空間
    jpeg_read_scanlines(&dinfo,&pLineColor,1);//每讀取一行,output_scanline自動+1
	
    //處理一行
    for(col=0;col<800&&col<dinfo.image_width;col++)
    {
        red=*pTmpColor;
        green=*(pTmpColor+1);
        blue=*(pTmpColor+2);
        pTmpColor+=3;
        *(pFrameBuffer+(dinfo.output_scanline-1)*800+col)=(red<<16)|(green<<8)|blue;
    }
}

jpeg_finish_decompress(&dinfo);//完成解壓
munmap(pFrameBuffer,800*480*4);
free(pLineColor);
fclose(fp);
close(fd);

exit:
jpeg_destroy_decompress(&dinfo);//銷燬解壓物件,釋放資源

return 0;

}

相關文章