日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libjpeg(2)

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libjpeg(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* JPEG解壓縮的示例程序。我們假定源文件名被傳入。我們想要成功返回1,錯誤為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真的指向一個my_error_mgr結構,所以強制指針*/my_error_ptr myerr = (my_error_ptr) cinfo->err;/*始終顯示消息。*//*如果我們選擇,我們可以推遲這個,直到返回。*/(*cinfo->err->output_message) (cinfo);/*將控制返回到setjmp點*/longjmp(myerr->setjmp_buffer, 1); }int read_JPEG_file (char *filename) {/*此結構體包含JPEG解壓縮參數和指針工作空間(由JPEG庫根據需要分配)*/struct jpeg_decompress_struct cinfo;/*我們使用我們的專用擴展JPEG錯誤處理程序。*請注意,此結構體必須與主要的JPEG參數一樣的生存周期,以避免指針問題。*/struct my_error_mgr jerr;FILE *infile; /* 源文件 */JSAMPARRAY buffer; /* 輸出行緩沖區*/int row_stride; /* 輸出緩沖區中的物理行寬 *//*在這個例子中,我們要做任何事情之前打開輸入文件,*所以下面的setjmp()錯誤恢復可以假定文件是打開的。*使用“b”選項來fopen()要求它讀取二進制文件。*/if ((infile = fopen(filename, "rb")) == NULL) {fprintf(stderr, "can't open %s\n", filename);return 0;}/*步驟1:分配和初始化JPEG解壓縮對象*//*我們設置正常的JPEG錯誤例程,然后覆蓋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)){/*如果我們到達這里,JPEG代碼發出了一個錯誤信號。*我們需要清理JPEG對象,關閉輸入文件并返回。*/jpeg_destroy_decompress(&cinfo);fclose(infile);return 0;}/*現在我們可以初始化JPEG解壓縮對象。*/jpeg_create_decompress(&cinfo);/*步驟2:指定數據源(例如,文件)*/jpeg_stdio_src(&cinfo, infile);/*步驟3:使用jpeg_read_header()*/(void) jpeg_read_header(&cinfo, TRUE);/*我們可以忽略來自jpeg_read_header的返回值*(a)stdio數據源不可能暫停,*(b)我們通過TRUE來拒絕僅表格的JPEG文件作為錯誤。*//*步驟4:設置解壓縮參數*//*在本示例中,我們不需要更改任何設置的默認值* jpeg_read_header(),所以我們什么也不做。*//*步驟5:啟動解壓縮器*/(void) jpeg_start_decompress(&cinfo);/*我們可以忽略返回值,因為暫停是不可能的與stdio數據源。*//*在閱讀之前,我們可能需要做一些我們自己的設置數據。*在jpeg_start_decompress()之后,我們有正確的縮放*輸出圖像尺寸可用,以及輸出顏色圖*如果我們要求顏色量化。*在這個例子中,我們需要制作一個正確大小的輸出工作緩沖區。*//*輸出緩沖區中每行的JSAMPLE */row_stride = cinfo.output_width * cinfo.output_components;/*制作一行高的樣本數組,當完成圖像*/buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);/*步驟6:while(掃描線仍然被讀取)*//* jpeg_read_scanlines(...); *//*這里我們使用庫的狀態變量cinfo.output_scanline作為循環計數器*/while (cinfo.output_scanline < cinfo.output_height){/* jpeg_read_scanlines需要一組指向掃描線的指針。*這里的數組只有一個元素長,但你可以要求一次掃描線一次,如果這樣更方便。*/(void) jpeg_read_scanlines(&cinfo, buffer, 1);/*假設put_scanline_someplace需要一個指針和樣本計數。*/put_scanline_someplace(buffer[0], row_stride);}/*步驟7:完成減壓*/(void) jpeg_finish_decompress(&cinfo);/*我們可以忽略返回值,因為暫停是不可能的與stdio數據源。*//*第8步:釋放JPEG解壓縮對象*//*這是一個重要的步驟,因為它會釋放大量的內存。*/jpeg_destroy_decompress(&cinfo);/*在finish_decompress之后,我們可以關閉輸入文件。*這里我們推遲它,直到沒有更多的JPEG錯誤是可能的,以便簡化上面的setjmp錯誤邏輯。*/fclose(infile);/*此時,您可能需要檢查是否有損壞的數據發生警告(測試jerr.pub.num_warnings是否為零)*/return 1; }

總結

以上是生活随笔為你收集整理的libjpeg(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。