Linux--使用libjpeg庫解碼jpg圖片
阿新 • • 發佈:2018-12-08
使用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;
資料處理過程: