|
delphi實(shí)現(xiàn)bmp與jpg圖像相互轉(zhuǎn)換及位圖大小調(diào)整 摘 要:本文介紹了如何通過delphi編碼實(shí)現(xiàn)bmp格式圖像與jpeg格式圖像的相互轉(zhuǎn)換以 及bmp格式圖像的大小的調(diào)整。在圖片處理操作中使用了幾個(gè)api函數(shù),其算法同樣適用于其他編程語(yǔ)言。 關(guān)鍵詞:圖形轉(zhuǎn)換、圖片調(diào)整 在很多MIS系統(tǒng)或者其他管理信息系統(tǒng)中,有需要用戶上傳照片到數(shù)據(jù)庫(kù)等對(duì)圖片的操作,根據(jù)系統(tǒng)需求不同,可能需要對(duì)這些照片進(jìn)行格式轉(zhuǎn)換或者大小的調(diào)整。這里有三個(gè)在MIS系統(tǒng)或者其他管理信息系統(tǒng)中比較常用的圖片處理過程,與大家分享。 1、 Bmp格式轉(zhuǎn)換位jpg(jpeg)格式。 進(jìn)程:Image_BitmapToJPeg實(shí)現(xiàn)bmp格式圖片到Jpg(jpeg)格式圖片的轉(zhuǎn)換,如下: {參數(shù)介紹: FileName:要轉(zhuǎn)換的位圖的路徑及名稱 SaveFileName:轉(zhuǎn)換后生成 jpg圖形的路徑及名稱} Procedure Image_BitmapToJPeg(Const FileName: String;SaveFileName:String=''); Var Bitmap: TBitmap; //定義變量 JPeg: TJPegImage; //所屬unit是:Jpeg,需要在項(xiàng)目的uses 中 加入Jpeg Begin Try Bitmap := TBitmap.Create; //創(chuàng)建位圖資源 Bitmap.LoadFromFile(FileName); //根據(jù)傳入的參數(shù)載入位圖資源 JPeg := TJPegImage.Create; //創(chuàng)建jpeg資源 JPeg.Assign(Bitmap); //把bitmap中的圖像資源拷貝到j(luò)peg對(duì)象中 IF Trim(SaveFileName)='' Then //如果傳入的目的地址為空,按原名保存(擴(kuò)展名改變) JPeg.SaveToFile(ChangeFileExt(FileName, '.jpg')) Else //按參數(shù)指定的名稱保存jpg圖片 JPeg.SaveToFile(SaveFileName); Finally FreeAndNil(Bitmap); //釋放資源 FreeAndNil(JPeg); //釋放資源 End; End; 從上面的代碼及其注釋中我們可以看出程序思路,首先分別定義并創(chuàng)建bmp對(duì)象Bitmap和jpeg對(duì)象JPeg,然后在Bitmap對(duì)象載入位圖后,把Bitmap中的圖像 資源復(fù)制到Jpeg中,最后把Jpeg保存到磁盤并釋放創(chuàng)建的對(duì)象。 2、 Jpg(jpeg)格式轉(zhuǎn)換為bmp格式。 進(jìn)程:Image_JPegToBitmap實(shí)現(xiàn)Jpg(jpeg)格式圖片到bmp格式圖片的轉(zhuǎn)換,如下:
名人堂:眾名人帶你感受他們的驅(qū)動(dòng)人生馬云任志強(qiáng)李嘉誠(chéng)柳傳志史玉柱
{參數(shù)介紹: FileName:要轉(zhuǎn)換的 jpg圖形的路徑及名稱 SaveFileName:轉(zhuǎn)換后生成位圖的路徑及名稱} Procedure Image_JPegToBitmap(Const FileName: String;SaveFileName:String=''); Var Bitmap: TBitmap; //定義變量 JPeg: TJPegImage; //所屬unit是:Jpeg,需要在項(xiàng)目的uses 中加入 Jpeg Begin Try JPeg := TJPegImage.Create; //創(chuàng)建jpeg資源 JPeg.LoadFromFile(FileName); //根據(jù)傳入的參數(shù)載入jpeg資源 Bitmap := TBitmap.Create; //創(chuàng)建位圖資源 Bitmap.Assign(JPeg); //把jpeg中的圖像資源拷貝到bitmap對(duì)象中 IF Trim(SaveFileName)='' Then //如果傳入的目的地址為空,按原名保存(擴(kuò)展名改變) Bitmap.SaveToFile(ChangeFileExt(FileName, '.bmp')) Else //按參數(shù)指定的名稱保存bmp圖片 Bitmap.SaveToFile(SaveFileName); Finally FreeAndNil(Bitmap); //釋放資源 FreeAndNil(JPeg); //釋放資源 End; End; 根據(jù)上面的代碼及其注釋我們可以看出,其程序思路與Image_BitmapToJPeg過 程的思路是一致的。 3、 Bmp位圖大小調(diào)整。 進(jìn)程:Image_FitBitmap實(shí)現(xiàn)對(duì)位圖大小的調(diào)整。如下: {參數(shù)介紹: Source:要轉(zhuǎn)換的 位圖的路徑及名稱 Dest: 轉(zhuǎn)換后生成位圖的路徑及名稱 x, y: 轉(zhuǎn)換后位圖圖片的寬和高} procedure Image_FitBitmap(const Source,Dest:string;const x,y:integer); var abmp,bbmp:tbitmap; //定義變量 abmp為源對(duì)象變量 bbmp為目的對(duì)象變量 begin abmp:=tbitmap.Create; //創(chuàng)建位圖資源 bbmp:=tbitmap.Create; //創(chuàng)建位圖資源 try abmp.LoadFromFile(Source); //載入源位圖資源 bbmp.Width:=x; //設(shè)置目的位圖的寬 bbmp.Height:=y; //設(shè)置目的位圖的高 bbmp.PixelFormat:=pfDevice; //設(shè)置位圖格式為當(dāng)前設(shè)備默認(rèn)格式 SetStretchBltMode(bbmp.Canvas.Handle,COLORONCOLOR);//設(shè)置指位圖拉伸模式
stretchblt(bbmp.Canvas.Handle,0,0,bbmp.Width,bbmp.Height,abmp.Canvas.Handle,0,0,abmp.Width,abmp.Height,srccopy); //從源矩形中復(fù)制一個(gè)位圖到目標(biāo)矩形并適當(dāng)壓縮bbmp.SaveToFile(Dest); //保存轉(zhuǎn)換后的目的圖片 finally abmp.Free; //釋放資源 bbmp.Free; //釋放資源 end; end; 結(jié)合上面的代碼及其注釋我們知道其思路,首先創(chuàng)建兩個(gè)位圖資源分別對(duì)應(yīng)源位圖(abmp)和目的位圖(bbmp),源位圖載入后,設(shè)置目的位圖的寬和高,然后通過api函數(shù)SetStretchBltMode來(lái)設(shè)置位圖的拉伸模式,通過api函數(shù)stretchblt設(shè)置目的位圖圖像資源,最后保存目的位圖到磁盤并釋放創(chuàng)建的對(duì)象。 上面三個(gè)過程的源代碼加入delphi程序中即可使用,其中TJPegImage 類型屬于Jpeg單元,也就是你使用該類的時(shí)候,需要在所在單元的uses中加入Jpeg。
|