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來設(shè)置位圖的拉伸模式,通過api函數(shù)stretchblt設(shè)置目的位圖圖像資源,最后保存目的位圖到磁盤并釋放創(chuàng)建的對(duì)象。
上面三個(gè)過程的源代碼加入delphi程序中即可使用,其中TJPegImage 類型屬于Jpeg單元,也就是你使用該類的時(shí)候,需要在所在單元的uses中加入Jpeg。
聯(lián)系客服