在圖像的處理過程中經常需要對圖像進行局部放大或其它處理操作,在VB中提供了一個非常實用的圖像處理控件PictureClip,利用此控件可以方便的完成圖像的局部放大或縮小操作。PictureClip控件的功能就是對一個原始位圖進行剪裁,根據用戶的需要可以有兩種剪裁方法,第一種方法是確定固定的剪裁尺寸,通過確定橫向與縱向的剪裁份數,控件均勻地把原始位圖分成不同的圖像塊,通過序號可以訪問每一個圖像塊,此時需要的屬性有:PicClip1.Picture:指定被剪裁的圖像;PicClip1.Cols:確定剪裁的橫向份數;PicClip1.Rows:確定剪裁的縱向份數;PicClip1.GraphicCell(i):訪問第i個圖像塊;另一種剪裁方法是隨機剪裁,確定剪裁的起點,再確定需要剪裁的橫向與縱向尺寸,此固定區域內的圖像即剪裁為一可訪問的圖像,涉及的屬性有: PictureClip1.ClipX:指定剪裁的橫向起點坐標;
PictureClip1.ClipY:指定前裁的縱向起點坐標; PictureClip1.ClipHeight:指定剪裁的橫向長度;
PictureClip1.ClipWidth:指定剪裁的縱向長度;
PictureClip1.Clip:訪問被剪裁的圖形;
還有兩個重要的屬性,即StretchX和StretchY,此屬性指定被剪裁目標的圖像的大小,當此值與原始位圖尺寸不相同時,將引起剪裁圖像的放大或縮小,這就是利用此控件進行圖像局部放大或縮小的原理;
利用上述兩種剪裁方法均可以進行圖像的局部放大或縮小處理,但在實際應用中還是第二種剪裁方法更為實用,在具體的編程時還應注意以下幾點:
1.在PictureClip的StretchX及其它屬性中均以象素為單位,所以在對圖像進行操作時必須置作圖單位為象素,即使用ScaleMode=3命令;
2.在進行隨機剪裁時,如果使用固定的剪裁尺寸,當剪裁坐標移到圖像的邊緣時,圖像實際尺寸小於剪裁尺寸,將引起邊界溢出,解決的辦法是始終以鼠標坐標點之後的圖像尺寸為剪裁尺寸,然後再調整StretchX及StretchY值為剪裁尺寸的固定倍數,即可實現局部圖像固定比率的放大或縮小操作;
3.放大或縮小的局部圖像需要裝入圖像框或其它容器控件中,此窗口的位置必須是靈活變化的,即自動讓開被剪裁的區域,可通過判斷被剪裁區域起點的位置來臨時調整圖像框Letf及Top屬性來完成;
在下面是一個完整的演示程序,需要在窗體中放置一個PictureClip1及兩個PictureBox控件,Picture1可為任意大小,而Picture2最好接近窗體的1/4,用於顯示局部放大或縮小的圖像,之後把下面的代碼填入相應的事件之中,運行程序之後,將在屏幕上顯示圖像,用鼠標在此圖像上移動,如果按下左鍵移動則實現圖像的局部放大,按下右鍵移動實現圖像的局部縮小,不按下任何鍵則只在小窗口內顯示原尺寸的局部圖像,剪裁的起點是鼠標當前位置。
以上程序及方法在WINDOWS95系統下、VB5.0環境下調試通過。
附原程序:(下載)
注釋:准備窗體和圖像框
PrivateSubForm_Load()
Picture1.ScaleMode=3
Picture1.Picture=LoadPicture("c:windowssetup.bmp")
Form1.Width=Screen.Width
Form1.Height=Screen.Height
Form1.Top=0
Form1.Left=0注釋:修改PICTURE尺寸與屏幕相同
Picture1.Width=Screen.Width
Picture1.Height=Screen.Height
Picture1.Top=0
Picture1.Left=0
PictureClip1.Picture=Picture1.Picture
EndSub
注釋:移動鼠標放大或縮小圖像
PrivateSubPicture1_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
Dimpx,py,LeftDown,rightDown,num
LeftDown=(ButtonAndvbLeftButton)>0rightDown=(ButtonAndvbRightButton)>0
IfLeftDownThennum=2注釋:左鍵按下放大二位
Else
IfrightDownThennum=1/2注釋:右鍵按下縮小
Elsenum=1注釋:無鍵按下原來尺寸
EndIf
EndIf
IfX<Picture1.ScaleWidth/2Then
px=Picture1.Width/2
Else
px=0
EndIf
IfY<Picture1.ScaleHeight/2Then
py=Picture1.Height/2
Else
py=0
EndIf
Picture2.Left=px
Picture2.Top=py注釋:以上實時調整小窗口坐標
Form1.Caption=Str$(X) ":" Str$(Y)PictureClip1.ClipX=X注釋:以當前鼠標位置為起點
PictureClip1.ClipY=Y
PictureClip1.ClipHeight=Picture1.ScaleHeight-Y
PictureClip1.ClipWidth=Picture1.ScaleWidth-X
PictureClip1.StretchX=(Picture1.ScaleWidth-X)*num
PictureClip1.StretchY=(Picture1.ScaleHeight-Y)*num
Picture2.Picture=PictureClip1.Clip注釋:小窗口顯示圖像
EndSub->