libjpeg(2)
生活随笔
收集整理的這篇文章主要介紹了
libjpeg(2)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/* JPEG解壓縮的示例程序。我們假定源文件名被傳入。我們想要成功返回1,錯(cuò)誤為0。*/struct my_error_mgr
{struct jpeg_error_mgr pub; /* "public" fields */jmp_buf setjmp_buffer; /* for return to caller */
};typedef struct my_error_mgr *my_error_ptr;void my_error_exit (j_common_ptr cinfo)
{/* cinfo-> err真的指向一個(gè)my_error_mgr結(jié)構(gòu),所以強(qiáng)制指針*/my_error_ptr myerr = (my_error_ptr) cinfo->err;/*始終顯示消息。*//*如果我們選擇,我們可以推遲這個(gè),直到返回。*/(*cinfo->err->output_message) (cinfo);/*將控制返回到setjmp點(diǎn)*/longjmp(myerr->setjmp_buffer, 1);
}int read_JPEG_file (char *filename)
{/*此結(jié)構(gòu)體包含JPEG解壓縮參數(shù)和指針工作空間(由JPEG庫根據(jù)需要分配)*/struct jpeg_decompress_struct cinfo;/*我們使用我們的專用擴(kuò)展JPEG錯(cuò)誤處理程序。*請(qǐng)注意,此結(jié)構(gòu)體必須與主要的JPEG參數(shù)一樣的生存周期,以避免指針問題。*/struct my_error_mgr jerr;FILE *infile; /* 源文件 */JSAMPARRAY buffer; /* 輸出行緩沖區(qū)*/int row_stride; /* 輸出緩沖區(qū)中的物理行寬 *//*在這個(gè)例子中,我們要做任何事情之前打開輸入文件,*所以下面的setjmp()錯(cuò)誤恢復(fù)可以假定文件是打開的。*使用“b”選項(xiàng)來fopen()要求它讀取二進(jìn)制文件。*/if ((infile = fopen(filename, "rb")) == NULL) {fprintf(stderr, "can't open %s\n", filename);return 0;}/*步驟1:分配和初始化JPEG解壓縮對(duì)象*//*我們?cè)O(shè)置正常的JPEG錯(cuò)誤例程,然后覆蓋error_exit。*/cinfo.err = jpeg_std_error(&jerr.pub);jerr.pub.error_exit = my_error_exit;/*建立my_error_exit使用的setjmp返回上下文。*/if (setjmp(jerr.setjmp_buffer)){/*如果我們到達(dá)這里,JPEG代碼發(fā)出了一個(gè)錯(cuò)誤信號(hào)。*我們需要清理JPEG對(duì)象,關(guān)閉輸入文件并返回。*/jpeg_destroy_decompress(&cinfo);fclose(infile);return 0;}/*現(xiàn)在我們可以初始化JPEG解壓縮對(duì)象。*/jpeg_create_decompress(&cinfo);/*步驟2:指定數(shù)據(jù)源(例如,文件)*/jpeg_stdio_src(&cinfo, infile);/*步驟3:使用jpeg_read_header()*/(void) jpeg_read_header(&cinfo, TRUE);/*我們可以忽略來自jpeg_read_header的返回值*(a)stdio數(shù)據(jù)源不可能暫停,*(b)我們通過TRUE來拒絕僅表格的JPEG文件作為錯(cuò)誤。*//*步驟4:設(shè)置解壓縮參數(shù)*//*在本示例中,我們不需要更改任何設(shè)置的默認(rèn)值* jpeg_read_header(),所以我們什么也不做。*//*步驟5:啟動(dòng)解壓縮器*/(void) jpeg_start_decompress(&cinfo);/*我們可以忽略返回值,因?yàn)闀和J遣豢赡艿呐cstdio數(shù)據(jù)源。*//*在閱讀之前,我們可能需要做一些我們自己的設(shè)置數(shù)據(jù)。*在jpeg_start_decompress()之后,我們有正確的縮放*輸出圖像尺寸可用,以及輸出顏色圖*如果我們要求顏色量化。*在這個(gè)例子中,我們需要制作一個(gè)正確大小的輸出工作緩沖區(qū)。*//*輸出緩沖區(qū)中每行的JSAMPLE */row_stride = cinfo.output_width * cinfo.output_components;/*制作一行高的樣本數(shù)組,當(dāng)完成圖像*/buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);/*步驟6:while(掃描線仍然被讀取)*//* jpeg_read_scanlines(...); *//*這里我們使用庫的狀態(tài)變量cinfo.output_scanline作為循環(huán)計(jì)數(shù)器*/while (cinfo.output_scanline < cinfo.output_height){/* jpeg_read_scanlines需要一組指向掃描線的指針。*這里的數(shù)組只有一個(gè)元素長,但你可以要求一次掃描線一次,如果這樣更方便。*/(void) jpeg_read_scanlines(&cinfo, buffer, 1);/*假設(shè)put_scanline_someplace需要一個(gè)指針和樣本計(jì)數(shù)。*/put_scanline_someplace(buffer[0], row_stride);}/*步驟7:完成減壓*/(void) jpeg_finish_decompress(&cinfo);/*我們可以忽略返回值,因?yàn)闀和J遣豢赡艿呐cstdio數(shù)據(jù)源。*//*第8步:釋放JPEG解壓縮對(duì)象*//*這是一個(gè)重要的步驟,因?yàn)樗鼤?huì)釋放大量的內(nèi)存。*/jpeg_destroy_decompress(&cinfo);/*在finish_decompress之后,我們可以關(guān)閉輸入文件。*這里我們推遲它,直到?jīng)]有更多的JPEG錯(cuò)誤是可能的,以便簡化上面的setjmp錯(cuò)誤邏輯。*/fclose(infile);/*此時(shí),您可能需要檢查是否有損壞的數(shù)據(jù)發(fā)生警告(測試jerr.pub.num_warnings是否為零)*/return 1;
}
總結(jié)
以上是生活随笔為你收集整理的libjpeg(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户模式下的线程同步
- 下一篇: ubuntu16.04 nginx安装