VFP處理JPG圖像文件方法談
發(fā)表時(shí)間:2023-07-18 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Bitmap是非壓縮型圖像文件,占用的存儲(chǔ)空間很大,而JPG圖像文件是壓縮型圖像文件,因此,正確保存和顯示JPG等圖像文件具有很高的實(shí)用價(jià)值。 在VFP編程中,需保存圖像文件時(shí),通常是將圖像以O(shè)...
Bitmap是非壓縮型圖像文件,占用的存儲(chǔ)空間很大,而JPG圖像文件是壓縮型圖像文件,因此,正確保存和顯示JPG等圖像文件具有很高的實(shí)用價(jià)值。
在VFP編程中,需保存圖像文件時(shí),通常是將圖像以O(shè)LE方式保存到一個(gè)GENERAL型字段中。當(dāng)需要在表單中顯示該圖像時(shí),則使用OLE Bound控件,并將該控件綁定到保存圖像的字段上即可。
上述方法對(duì)于保存和顯示Bitmap位圖時(shí)沒有問題,但是對(duì)JPG、GIF等圖像文件則無法顯示圖像,而只能將其保存時(shí)的圖像文件名顯示出來。
VFP 6.0版中的Imgae控件支持 bmp、gif、jpg和ico等圖像文件格式,但是該控件不能綁定到保存圖像文件的GENERAL型字段上。本文所采用的基本思路是:不將圖像文件保存到GENERAL型字段中,而是把圖像文件保存到一個(gè)二進(jìn)制的Memo型字段中,當(dāng)需要顯示圖像時(shí),則將該Memo型字段的內(nèi)容輸出到一個(gè)臨時(shí)文件中,然后再將臨時(shí)文件名賦給Image控件中Picture屬性即可顯示圖像。在報(bào)表打印輸出時(shí),也可以采用類似的方法打印圖像。
為實(shí)現(xiàn)上述的構(gòu)想,本文提供了兩個(gè)函數(shù),一個(gè)是將圖像文件保存到Memo型字段中,另一個(gè)是將Memo型字段中的圖像保存到一個(gè)外部文件中。
下面的過程文件是將一個(gè)外部圖像文件保存到二進(jìn)制Memo型字段中。圖像文件在Memo型字段中的格式為:前128個(gè)字節(jié)保存原始圖像文件名,其后的數(shù)據(jù)為圖像數(shù)據(jù)。
Procedure s—ftom
lparameter s—cfield , s—cfile
local s—temp—str
if vartype(s—cfield) !=″C″ or vartype(s—cfile) !=″C″
=MessageBox(″參數(shù)類型錯(cuò)!″,48,″提示″)
return .F.
endif
if type(″&s—cfield″) != ″M″
=MessageBox( ″ ′ ″+s—cfield +″ ′ ″+ ″字段必須是二進(jìn)制備注型數(shù)據(jù)!″,48,″提示″)
return .F.
endif
if !file( s—cfile)
=MessageBox( ″文件:″+s—cfile+″ 不存在!″,48,″提示″)
return .F.
endif
s—temp—str=PADR(JUSTFNAME(s—cfile),128, ′ ′)+filetostr(s—cfile)
replace (s—cfield) with s—temp—str
return .T.
endproc
下面的過程文件是將Memo型字段中的圖像保存到外部文件中,s—default—return當(dāng)Memo字段為空或讀寫錯(cuò)誤時(shí)該過程返回的隱含信息。該過程調(diào)用成功后返回所寫的圖像文件名,否則返回s—default—return的值。
procedure s—mtof
lparameter s—cfield, s—cfile, s—default—return, s—old—file
local s—temp—str, s—old—file, s—return
clear resource
s—return=s—default—return
s—old—file=′′
if vartype(s—cfield) !=″C″ or vartype(s—cfile) !=″C″ or vartype(s—default—return) !=″C″
=MessageBox(″參數(shù)類型錯(cuò)!″,48,″提示″)
return ′′
endif
if type(″&s—cfield″) != ″M″
=MessageBox( ″ ′ ″+s—cfield +″ ′ ″+ ″字段必須是二進(jìn)制備注型數(shù)據(jù)!″,48,″提示″)
return s—return
endif
s—temp—str = &s—cfield
if len(s—temp—str) 〈= 128
return s—return
endif
s—old—file = alltrim(left(s—temp—str,128))
if empty(s—cfile)
s—return=s—old—file
else
s—return=defaultext( s—cfile, alltrim(justext(s—old—file)) )
endif
=STRTOFILE( substr(s—temp—str,129), s—return, .F.)
return s—return
endproc
筆者使用該方法處理了大量的圖像文件,在CPU 為P133的電腦上,對(duì)于每個(gè)圖像文件不大于1.5MB的情況,處理速度非常滿意。當(dāng)圖像文件較大時(shí),則顯示速度比較慢。