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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

IJGJPEG格式文作者:ysm日期:2009年10月27 cIJG全稱IndependentJPEGGroup,是一個(gè)用于處理JPEG文件格式的開源庫(kù)。用于遙感和地理信息系統(tǒng)數(shù)據(jù)處理的GDAL就是用這個(gè)庫(kù)進(jìn)行JPEG格式解析的。IJG的主頁(yè)是 本文中將依據(jù)文檔中l(wèi)ibjpeg.doc介紹一些基本JPEG文件解壓縮和壓縮處理方式,細(xì)節(jié)及其他高級(jí)操作可以參libjpeg.doc中的具體介紹。編包 是 , ,如 到C\e.doc是IJG比如s.doc就以oc。Lpeg.doc你用IG說(shuō)另個(gè)mpc用IJG行JPEG代及照xaple.c的架IJG支持多平臺(tái)下的應(yīng)用,不同平臺(tái)下的編譯安裝細(xì)節(jié)都可以在install.doc中找到。在此MSVC2005在windows下使用的時(shí)候需要對(duì)源代碼做幾處修改。在頭文件jmorecfg.h中找到如下代碼:#ifdefNEED_FAR_POINTERS#defineFARfar#defineFAR在這段代碼下面添加一#define /*ysm還是在這個(gè)文件中#ifndefXMD_H /*X11/xmd.hcorrectlydefinesINT32*/typedeflongINT32;修改#ifndefXMD_H /*ysmfixed*/#ifndef_BASETSD_H_typedeflongINT32;開始編譯前需要首先將jconfig.vc更名為jconfig.h,然后在命令行下進(jìn)入到VC2005的安裝 比如在我的機(jī)器上是C:\ProgramFiles\ VisualStudio8\VC,在bin 下有一個(gè)名為 些環(huán)境變量,然后不要關(guān)閉當(dāng)前命令窗口,進(jìn)入到IJG的安裝 ,在此即C:\jpeg-6b下,執(zhí)行命C函數(shù)在VC2005下被認(rèn)為是不安全而過(guò)時(shí)的,不過(guò)沒(méi)什么大關(guān)系,忽略就行,這個(gè)警告在用VC6編譯完成后,IJG的安裝下會(huì)出現(xiàn)若干文件,我們所需要的是一個(gè)叫l(wèi)ibjpeg.lib的靜態(tài)庫(kù)文件,在編譯我們程序的時(shí)候使用。除此一般還要用4個(gè)頭文件,jconfig.h、jerror.h、,下中有使用方法的介紹。但對(duì)程序員來(lái)說(shuō),最重要的還是4個(gè)頭文件加一個(gè)庫(kù)文件,以后用IJG開開發(fā)環(huán)境配的項(xiàng)目當(dāng)前下,系統(tǒng)的頭文件下,或者VC環(huán)境下做一下配置,也就是在菜單工具-選項(xiàng)-項(xiàng)目和解決方案-VC++下lib文件所在的分別添加到包含文件和庫(kù)文件[在程序中需要引入的頭文件就是jpeglib.h,由于IJGC語(yǔ)言寫的,所C++引入這個(gè)頭文件就需要使用extern“C”,如下所示:extern{#include}此此外,在jmorecfg.h中有段關(guān)于而 文件的引入則需要在項(xiàng)目的屬性頁(yè)下的配置屬性 器-輸入-附加依賴項(xiàng)中添libjpeg.lib[至此,配置步驟完成,于是就可以開始用IJG寫程序了JPEG對(duì)象分配空間并初始指定解壓縮數(shù)據(jù)獲取文件信為解壓縮設(shè)定參數(shù),包括圖像大小,顏色空開始解壓取出數(shù)解壓縮完釋放資JPEG對(duì)象分配空間并初始解壓縮過(guò)程中使用的JPEG對(duì)象是一個(gè) press_struct的結(jié)構(gòu)體。同時(shí)還需要定義一個(gè)用于錯(cuò)誤處理的結(jié)構(gòu)體對(duì)象,IJG中標(biāo)準(zhǔn)的錯(cuò)誤結(jié)構(gòu)體是jpeg_error_mgr。 press_structcinfo;structjpeg_error_mgrjerr;然后是將錯(cuò)誤然后是將錯(cuò)誤處理結(jié)構(gòu)對(duì)象綁定在JPEG對(duì)象上cinfo.err=這個(gè)標(biāo)準(zhǔn)的錯(cuò)誤處理結(jié)構(gòu)將使程序在出現(xiàn)錯(cuò)誤時(shí)調(diào)用x)初始化cinfo結(jié)構(gòu)指定解壓縮數(shù)據(jù)利用標(biāo)準(zhǔn)C中的文件指針傳遞要jpg獲取文件信IJG將圖像的缺省信息填充到cinfo結(jié)構(gòu)中以便程序使用 ponents等。為解壓縮設(shè)定參在完成jpeg_read_header 比如可以設(shè)定解出來(lái)的圖像的大小,也就是與原圖的比例。使用scale_num和scale_denom兩個(gè)參數(shù),解出來(lái)的圖像scale_num/scale_denomIJG當(dāng)前僅1/1,1/2,1/4,和1/8這幾種縮小比例。比如要取得1/2原圖的圖像,需要如下設(shè)定 FILE*if((infile=fopen("sample.jpg","rb"))=={return}(void) ;cinfo,JCS_RGBJCS_GRAYSCALE開始解壓根據(jù)設(shè)定的解壓縮參數(shù)進(jìn)行圖像解壓縮操作 在完成解壓縮操作后,IJG就會(huì)將解壓后的圖像信息填充至cinfo結(jié)構(gòu)中。比如,輸出圖像寬ponents(比如灰度為1,全彩色為3)等。一般情況下,這些參數(shù)是 press之前就獲得這些參數(shù),可以通過(guò)調(diào)用jpeg_calc_output_dimensions()方法來(lái)實(shí)現(xiàn)取出數(shù)解開的數(shù)據(jù)是按照行取出的,數(shù)據(jù)像素按照scanline來(lái),scanline是從左到右,從上到下的順scanline中的數(shù)據(jù)模式是R,G,B,R,G,B,R,G,B,…,每條scanline是一個(gè)JSAMPLE類型的數(shù)組,一般來(lái)說(shuō)就unsignedchar,定義jmorecfg.h中。JSAMPLE,IJG還定JSAMPROWJSAMPARRAY,分別表示一行JSAMPLE和一JSAMPLE數(shù)組在此,我們定義一個(gè)JSAMPARRAY類型的緩沖區(qū)變量來(lái)存放圖像數(shù)JSAMPARRAY然后是計(jì)算每行需要的空間大小,比如RGB圖像就是寬度×3,灰度圖就是寬度row_stride=cinfo.output_width 為緩沖區(qū)分配空間,這里使用了IJG的內(nèi)存管理器來(lái)完成分配JPOOL_IMAGE表示分配的內(nèi)存空間將在調(diào)用 jpeg_abort后被釋放,而如果此參數(shù)改為JPOOL_PERMANENT則表示內(nèi)存將一直到JPEG對(duì)象 如上所說(shuō),是每行數(shù)據(jù)的實(shí)際大小最后一個(gè)參數(shù)是要分配多少行數(shù)據(jù)。此處只分配了一行buffer=(*cinfo.mem->alloc_sarray)(( mon_ptr);cinfo,JPOOL_IMAGE,row_stride,1);outsaoutsaie經(jīng) 沖數(shù)1次 或而如果還希望繼續(xù)使用JPEG對(duì)象,則可使或完整例while(cinfo.output_scanline<{(void)jpeg_read_scanlines(;cinfo,buffer,//do}解壓縮完 釋放資退出程如果不再需要JPEG對(duì)象,則使 press_structcinfo;structjpeg_error_mgrjerr;FILE*infile;JSAMPARRAYbuffer;introw_stride;cinfo.err= if((infile=fopen("sample.jpg","rb"))=={}//設(shè)定解壓縮參數(shù),此處圖像長(zhǎng)寬縮小為原圖的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圖像的壓縮壓縮操作過(guò)JPEG對(duì)象分配空間并初始指定圖像輸出目為壓縮設(shè)定參數(shù),包括圖像大小,顏色開始?jí)簩懭霐?shù)壓縮完釋放資JPEG對(duì)象分配空間并初始?jí)嚎s過(guò)程中使用JPEG對(duì)象是一press_struct的結(jié)構(gòu)體。同時(shí)還需要定義一個(gè)用錯(cuò)誤處理的結(jié)構(gòu)體對(duì)象,IJG中標(biāo)準(zhǔn)的錯(cuò)誤結(jié)構(gòu)體是jpeg_error_mgr press_structcinfo;structjpeg_error_mgrjerr;然后是將錯(cuò)誤處然后是將錯(cuò)誤處理結(jié)構(gòu)對(duì)象綁定在JPEG對(duì)象上指定圖像輸出目利用標(biāo)準(zhǔn)C中的文件指針傳遞要jpg為壓縮設(shè)定在開始?jí)嚎s數(shù)據(jù)之前需要為壓縮指定幾個(gè)參數(shù)和缺省參設(shè)定缺省參數(shù)之前需要指定的幾個(gè)參數(shù)是:圖像寬度cinfo.image_width,圖像高度 ponents(比如RGB圖像為3,灰度圖為1),圖像顏色空間cinfo.in_color_space(比如真彩色JCS_RGB,灰度圖JCS_GRAYSCALE)如然后是設(shè)定缺省設(shè)注意此處,在setdefault之前,必須設(shè)定in_color_space,因?yàn)槟承┤笔?shù)的設(shè)定需要正確colorspace這個(gè)標(biāo)準(zhǔn)的錯(cuò)誤處理結(jié)構(gòu)將使程序在出現(xiàn)錯(cuò)誤時(shí)調(diào)用x)初始化cinfo結(jié)構(gòu) FILE*if((outfile=fopen(filename,"wb"))=={return}cinfo.image_width=cinfo.image_height=ponents=3;cinfo.in_color_space=JCS_RGB; 在此之后還可以對(duì)其他的一些參數(shù)進(jìn)行設(shè)定。具體有哪些參數(shù)可以查詢?cè)诖酥筮€可以對(duì)其他的一些參數(shù)進(jìn)行設(shè)定。具體有哪些參數(shù)可以查詢 文檔quality是個(gè)0~100之間的整數(shù),表示壓縮比率開始?jí)焊鶕?jù)設(shè)定的壓縮參數(shù)進(jìn)行圖像壓縮操o,開始?jí)嚎s過(guò)程后就不可以修改寫入數(shù)對(duì)象參數(shù)row_stride=image_width*同上文介紹的解壓縮操作中介紹的,要寫入的數(shù)據(jù)是按照行寫入的,數(shù)據(jù)像素按照scanline,與數(shù)據(jù)的不同是使用jpeg_write_scanlines類似于解壓縮操作中的cinfo.output_scanline<cinfo.output_height機(jī)制,壓縮過(guò)程使用cinfo.next_scanline<cinfo.image_height來(lái)判斷是否完成寫入數(shù)在此,假設(shè)image_bufferJSAMPARRAY類型變量,其中保存的是要輸出的圖像數(shù)據(jù),比如可以是用上文中的解壓縮操作從某JPEG文件中獲得的數(shù)據(jù)。JSAMPROWwhile(cinfo.next_scanline<{row_pointer=}壓縮完釋放資退出程如果不再需要JPEG對(duì)象,則使 或或而如果還希望繼續(xù)使用JPEG對(duì)象,則可使或完整例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=}錯(cuò)誤處錯(cuò)誤處在使用默認(rèn)錯(cuò)誤處理結(jié)jpeg_error_mgr的情況下,程序在遇到錯(cuò)誤后將調(diào)exit直接退出程依照example.c中的例子,IJG推薦使用C語(yǔ)言的setjmp和longjmp機(jī)制來(lái)重寫錯(cuò)誤處理結(jié)構(gòu)。同時(shí),程序?qū)⑿枰腩^文件setjmp.hstp以解壓縮過(guò)程為例,原程序?qū)⒈恍薷臑槿缦滦蝧truct{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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論