軟件-9avi學習使用ijg讀寫jpeg格式文件_第1頁
軟件-9avi學習使用ijg讀寫jpeg格式文件_第2頁
軟件-9avi學習使用ijg讀寫jpeg格式文件_第3頁
軟件-9avi學習使用ijg讀寫jpeg格式文件_第4頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

IJGJPEG格式文作者:ysm日期:2009年10月27 cIJG全稱IndependentJPEGGroup,是一個用于處理JPEG文件格式的開源庫。用于遙感和地理信息系統(tǒng)數(shù)據(jù)處理的GDAL就是用這個庫進行JPEG格式解析的。IJG的主頁是 本文中將依據(jù)文檔中l(wèi)ibjpeg.doc介紹一些基本JPEG文件解壓縮和壓縮處理方式,細節(jié)及其他高級操作可以參libjpeg.doc中的具體介紹。編包 是 , ,如 到C\e.doc是IJG比如s.doc就以oc。Lpeg.doc你用IG說另個mpc用IJG行JPEG代及照xaple.c的架IJG支持多平臺下的應用,不同平臺下的編譯安裝細節(jié)都可以在install.doc中找到。在此MSVC2005在windows下使用的時候需要對源代碼做幾處修改。在頭文件jmorecfg.h中找到如下代碼:#ifdefNEED_FAR_POINTERS#defineFARfar#defineFAR在這段代碼下面添加一#define /*ysm還是在這個文件中#ifndefXMD_H /*X11/xmd.hcorrectlydefinesINT32*/typedeflongINT32;修改#ifndefXMD_H /*ysmfixed*/#ifndef_BASETSD_H_typedeflongINT32;開始編譯前需要首先將jconfig.vc更名為jconfig.h,然后在命令行下進入到VC2005的安裝 比如在我的機器上是C:\ProgramFiles\ VisualStudio8\VC,在bin 下有一個名為 些環(huán)境變量,然后不要關閉當前命令窗口,進入到IJG的安裝 ,在此即C:\jpeg-6b下,執(zhí)行命C函數(shù)在VC2005下被認為是不安全而過時的,不過沒什么大關系,忽略就行,這個警告在用VC6編譯完成后,IJG的安裝下會出現(xiàn)若干文件,我們所需要的是一個叫l(wèi)ibjpeg.lib的靜態(tài)庫文件,在編譯我們程序的時候使用。除此一般還要用4個頭文件,jconfig.h、jerror.h、,下中有使用方法的介紹。但對程序員來說,最重要的還是4個頭文件加一個庫文件,以后用IJG開開發(fā)環(huán)境配的項目當前下,系統(tǒng)的頭文件下,或者VC環(huán)境下做一下配置,也就是在菜單工具-選項-項目和解決方案-VC++下lib文件所在的分別添加到包含文件和庫文件[在程序中需要引入的頭文件就是jpeglib.h,由于IJGC語言寫的,所C++引入這個頭文件就需要使用extern“C”,如下所示:extern{#include}此此外,在jmorecfg.h中有段關于而 文件的引入則需要在項目的屬性頁下的配置屬性 器-輸入-附加依賴項中添libjpeg.lib[至此,配置步驟完成,于是就可以開始用IJG寫程序了JPEG對象分配空間并初始指定解壓縮數(shù)據(jù)獲取文件信為解壓縮設定參數(shù),包括圖像大小,顏色空開始解壓取出數(shù)解壓縮完釋放資JPEG對象分配空間并初始解壓縮過程中使用的JPEG對象是一個 press_struct的結構體。同時還需要定義一個用于錯誤處理的結構體對象,IJG中標準的錯誤結構體是jpeg_error_mgr。 press_structcinfo;structjpeg_error_mgrjerr;然后是將錯誤然后是將錯誤處理結構對象綁定在JPEG對象上cinfo.err=這個標準的錯誤處理結構將使程序在出現(xiàn)錯誤時調用x)初始化cinfo結構指定解壓縮數(shù)據(jù)利用標準C中的文件指針傳遞要jpg獲取文件信IJG將圖像的缺省信息填充到cinfo結構中以便程序使用 ponents等。為解壓縮設定參在完成jpeg_read_header 比如可以設定解出來的圖像的大小,也就是與原圖的比例。使用scale_num和scale_denom兩個參數(shù),解出來的圖像scale_num/scale_denomIJG當前僅1/1,1/2,1/4,和1/8這幾種縮小比例。比如要取得1/2原圖的圖像,需要如下設定 FILE*if((infile=fopen("sample.jpg","rb"))=={return}(void) ;cinfo,JCS_RGBJCS_GRAYSCALE開始解壓根據(jù)設定的解壓縮參數(shù)進行圖像解壓縮操作 在完成解壓縮操作后,IJG就會將解壓后的圖像信息填充至cinfo結構中。比如,輸出圖像寬ponents(比如灰度為1,全彩色為3)等。一般情況下,這些參數(shù)是 press之前就獲得這些參數(shù),可以通過調用jpeg_calc_output_dimensions()方法來實現(xiàn)取出數(shù)解開的數(shù)據(jù)是按照行取出的,數(shù)據(jù)像素按照scanline來,scanline是從左到右,從上到下的順scanline中的數(shù)據(jù)模式是R,G,B,R,G,B,R,G,B,…,每條scanline是一個JSAMPLE類型的數(shù)組,一般來說就unsignedchar,定義jmorecfg.h中。JSAMPLE,IJG還定JSAMPROWJSAMPARRAY,分別表示一行JSAMPLE和一JSAMPLE數(shù)組在此,我們定義一個JSAMPARRAY類型的緩沖區(qū)變量來存放圖像數(shù)JSAMPARRAY然后是計算每行需要的空間大小,比如RGB圖像就是寬度×3,灰度圖就是寬度row_stride=cinfo.output_width 為緩沖區(qū)分配空間,這里使用了IJG的內存管理器來完成分配JPOOL_IMAGE表示分配的內存空間將在調用 jpeg_abort后被釋放,而如果此參數(shù)改為JPOOL_PERMANENT則表示內存將一直到JPEG對象 如上所說,是每行數(shù)據(jù)的實際大小最后一個參數(shù)是要分配多少行數(shù)據(jù)。此處只分配了一行buffer=(*cinfo.mem->alloc_sarray)(( mon_ptr);cinfo,JPOOL_IMAGE,row_stride,1);outsaoutsaie經(jīng) 沖數(shù)1次 或而如果還希望繼續(xù)使用JPEG對象,則可使或完整例while(cinfo.output_scanline<{(void)jpeg_read_scanlines(;cinfo,buffer,//do}解壓縮完 釋放資退出程如果不再需要JPEG對象,則使 press_structcinfo;structjpeg_error_mgrjerr;FILE*infile;JSAMPARRAYbuffer;introw_stride;cinfo.err= if((infile=fopen("sample.jpg","rb"))=={}//設定解壓縮參數(shù),此處圖像長寬縮小為原圖的1/2 //GDI+在客戶區(qū)繪制圖像CClientDCdc(this);Bitmapbm(cinfo.output_width,cinfo.output_height);Graphicsgraphics(dc.GetSafeHdc());Graphicsgdc(row_stride=cinfo.output_width buffer=(*cinfo.mem->alloc_sarray)(( mon_ptr);cinfo,JPOOL_IMAGE,row_stride,1);while(cinfo.output_scanline<{(void)jpeg_read_scanlines(;cinfo,buffer,//output_scanline11intline=cinfo.output_scanline-1;for(inti=0;iJPEGJPEG圖像的壓縮壓縮操作過JPEG對象分配空間并初始指定圖像輸出目為壓縮設定參數(shù),包括圖像大小,顏色開始壓寫入數(shù)壓縮完釋放資JPEG對象分配空間并初始壓縮過程中使用JPEG對象是一press_struct的結構體。同時還需要定義一個用錯誤處理的結構體對象,IJG中標準的錯誤結構體是jpeg_error_mgr press_structcinfo;structjpeg_error_mgrjerr;然后是將錯誤處然后是將錯誤處理結構對象綁定在JPEG對象上指定圖像輸出目利用標準C中的文件指針傳遞要jpg為壓縮設定在開始壓縮數(shù)據(jù)之前需要為壓縮指定幾個參數(shù)和缺省參設定缺省參數(shù)之前需要指定的幾個參數(shù)是:圖像寬度cinfo.image_width,圖像高度 ponents(比如RGB圖像為3,灰度圖為1),圖像顏色空間cinfo.in_color_space(比如真彩色JCS_RGB,灰度圖JCS_GRAYSCALE)如然后是設定缺省設注意此處,在setdefault之前,必須設定in_color_space,因為某些缺省參數(shù)的設定需要正確colorspace這個標準的錯誤處理結構將使程序在出現(xiàn)錯誤時調用x)初始化cinfo結構 FILE*if((outfile=fopen(filename,"wb"))=={return}cinfo.image_width=cinfo.image_height=ponents=3;cinfo.in_color_space=JCS_RGB; 在此之后還可以對其他的一些參數(shù)進行設定。具體有哪些參數(shù)可以查詢在此之后還可以對其他的一些參數(shù)進行設定。具體有哪些參數(shù)可以查詢 文檔quality是個0~100之間的整數(shù),表示壓縮比率開始壓根據(jù)設定的壓縮參數(shù)進行圖像壓縮操o,開始壓縮過程后就不可以修改寫入數(shù)對象參數(shù)row_stride=image_width*同上文介紹的解壓縮操作中介紹的,要寫入的數(shù)據(jù)是按照行寫入的,數(shù)據(jù)像素按照scanline,與數(shù)據(jù)的不同是使用jpeg_write_scanlines類似于解壓縮操作中的cinfo.output_scanline<cinfo.output_height機制,壓縮過程使用cinfo.next_scanline<cinfo.image_height來判斷是否完成寫入數(shù)在此,假設image_bufferJSAMPARRAY類型變量,其中保存的是要輸出的圖像數(shù)據(jù),比如可以是用上文中的解壓縮操作從某JPEG文件中獲得的數(shù)據(jù)。JSAMPROWwhile(cinfo.next_scanline<{row_pointer=}壓縮完釋放資退出程如果不再需要JPEG對象,則使 或或而如果還希望繼續(xù)使用JPEG對象,則可使或完整例press_structstructjpeg_error_mgrjerr;FILE*outfile;JSAMPROWrow_pointer;introw_stride;cinfo.err= if((outfile=fopen("dest.jpg","wb"))=={} cinfo.image_width=image_width;cinfo.image_height=image_height;ponents=cinfo.in_color_space=;cinfo,90,;cinfo,row_stride=image_width*while(cinfo.next_scanline<{row_pointer=}錯誤處錯誤處在使用默認錯誤處理結jpeg_error_mgr的情況下,程序在遇到錯誤后將調exit直接退出程依照example.c中的例子,IJG推薦使用C語言的setjmp和longjmp機制來重寫錯誤處理結構。同時,程序將需要引入頭文件setjmp.hstp以解壓縮過程為例,原程序將被修改為如下形struct{structjpeg_error_mgrpub;jmp_bufsetjmp_buffer;typedefstructmy_error_mgr*METHODDEF(void)my_error_exit mon_ptr{my_error_ptrmyerr=(my_error_ptr)cinfo->err;(*cinfo->err->output_message)(cinfo);longjmp(myerr->setjmp_b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論