1. 程式人生 > >Linux--使用libjpeg庫解碼jpg圖片

Linux--使用libjpeg庫解碼jpg圖片

使用libjpeg庫解碼jpg圖片

libjpeg版本:v6b 執行環境:arm

/*
 *函式功能:解碼jpg圖片,儲存解碼出來的資料
 *函式引數:pPic記錄源jpg圖片,解碼得到圖片寬高、位深度、顯示資料
 *返回值  :解碼正確返回0,錯誤返回-1
 */
int jpg_analyze (struct pic_info *pPic)
{
    struct jpeg_decompress_struct cinfo; //解壓引數
    struct my_error_mgr jerr;
    FILE * infile;              //指向開啟圖片的指標 
char * buffer = NULL; //指向解碼行資料的指標 int row_stride; //解碼出來的一行圖片資訊的位元組數 if ((infile = fopen(pPic->pathname, "rb")) == NULL) { fprintf(stderr, "can't open %s\n", pPic->pathname); return -1; } //第1步:申請和初始化JPEG解壓目標 cinfo.err = jpeg_std_error(&jerr.pub
); //輸出型引數 jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); fclose(infile); return -1; } //給解碼器作必要的記憶體分配和資料結構的初始化 jpeg_create_decompress(&cinfo); //第2步:將fopen開啟的源jpg圖片和解碼器相關聯 jpeg_stdio_src(&cinfo, infile); //第3步:讀取圖片頭資訊
(void) jpeg_read_header(&cinfo, TRUE); //第4步:開始解碼 (void) jpeg_start_decompress(&cinfo); row_stride = cinfo.output_width * cinfo.output_components; //一行的位元組數 buffer = (char *)malloc(row_stride); //申請一行的空間 if (NULL == buffer) { fprintf(stderr, "cinfo.mem->alloc_sarray error.\n"); return -1; } //第5步:逐行解碼,並將解碼出的資料存到buffer中 while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, &buffer, 1); //將buffer中的一行資料移到資料緩衝區中 memcpy(pPic->pData + cinfo.output_scanline*row_stride, buffer, row_stride); } pPic->bpp = cinfo.output_components*8; pPic->height = cinfo.image_height; pPic->width = cinfo.image_width; //第6步:結束解碼 (void) jpeg_finish_decompress(&cinfo); //第7步:釋放解碼目標 jpeg_destroy_decompress(&cinfo); fclose(infile); return 0; } typedef struct pic_info { char *pathname; //圖片在系統中的檔名加路徑名 unsigned int width; //寬 unsigned int height; //高 unsigned int bpp; //位深度 unsigned char *pData; //指向圖片資料緩衝區 } pic_info;

資料處理過程: