[WM]利用Microsoft.Drawing擴充Graphics & 繪製縮圖 Part2

在上一篇[WM]利用Microsoft.Drawing擴充Graphics & 繪製縮圖當中有提到可以利用Microsoft.Drawing的命名空間下去繪製縮圖,而點了縮圖之後會叫出第二個Form來顯示較大的圖形,但顯示較大的圖形時,也只有一個等級;能不能再放大來看呢,今天就來測試看看這個部分。
首先,在Mobile 6.5的作業系統當中,在首頁可以看到圖片的瀏覽介面,像是下圖這樣

點選進入之後,就可以看到瀏覽的介面,選擇Zoom之後,會看到有個可以放大圖片的介面

今天就試做一個跟這個類似的瀏覽方式;在看程式碼之前,先說明一下大概實作的方向;筆者這邊背景放了一個較大的Picturebox,是顯示大圖用的,而在做放大的功能時,也是用偷懶的方式,設定picturebox的sizemode屬性為自動縮放;另外用一個panel來放置顯示縮圖的picturebox以及放大縮小的按鈕,在縮圖發生mousemove事件時,第一個動作是在縮圖上繪製紅色方框,之後移動下方的picturebox來模擬這樣的效果,那麼接下來就來看看程式碼的部分。
Imports Microsoft.Drawing

Public Class Form2
''暫存檔案位置
Private _filePath As String

Dim img As IImage
Dim imgThumb As IImage = Nothing
''繪製縮圖上面方框的pen
Dim rectPen As New Pen(Color.Red, 2)
Dim RectWidth As Integer = 30
Dim RectHeight As Integer = 30
''紀錄座標相關
Dim sX, sY As Integer ''來源位置
Dim dX, dY As Integer ''變動位置
Dim rX, rY As Integer ''實際繪製位置
''儲存原始圖檔
Dim tmpBmp As Bitmap
''儲存放大級數
Dim intLavel As Integer = 1
''儲存大圖pictureBox的原始寬、高
Dim intBigPicWidth As Integer = 234
Dim intBigPicHeight As Integer = 288

'''
''' 取得或設定檔案位置
'''

'''
'''
'''
Public Property FilePath() As String
Get
Return _filePath
End Get
Set(ByVal value As String)
_filePath = value
End Set
End Property

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
''產生縮圖
img = GetImage(_filePath)
img.GetThumbnail(picThumb.Width, picThumb.Height, imgThumb)
''將縮圖儲存在tag屬性中給paint事件使用
picThumb.Tag = imgThumb
imgThumb = Nothing
''初始化大圖緩衝區
tmpBmp = New Bitmap(FilePath)
''設定顯示大圖用的picturebox
picBig.SizeMode = PictureBoxSizeMode.StretchImage
picBig.Image = tmpBmp
''
rX = 0
rY = 0
End Sub

'''
''' 移動大圖
'''

'''
Private Sub DrawBigImage()
Me.SuspendLayout()
picBig.Width = intBigPicWidth * intLavel
picBig.Height = intBigPicHeight * intLavel
picBig.Left = 0 - (rX * intLavel)
picBig.Top = 0 - (rY * intLavel)
Me.ResumeLayout()
End Sub

'''
''' 取得影像相關動作
'''

'''
'''
'''
Private Function GetImage(ByVal fileName As String) As IImage
Dim imgFactory As IImagingFactory
imgFactory = ImagingFactory.GetImaging
Dim image As IImage = Nothing
imgFactory.CreateImageFromFile(fileName, image)
Return image
End Function

Private Sub picThumb_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picThumb.MouseDown
''取得起始參考點
sX = e.X
sY = e.Y
End Sub

Private Sub picThumb_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picThumb.MouseMove
''計算變量
dX = e.X - sX
dY = e.Y - sY
picThumb.Invalidate()
''大圖重新繪製
If intLavel > 1 Then DrawBigImage()
End Sub

Private Sub picThumb_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picThumb.Paint
If picThumb.Tag Is Nothing Then Exit Sub
''將圖片繪製到picturebox上
e.Graphics.DrawImageAlphaChannel(CType(picThumb.Tag, IImage), 0, 0)
''繪製方框
''判斷是否有超出範圍
rX = sX + dX
If rX - (RectWidth \ 2) < 0 Then
rX = 0
ElseIf rX + (RectWidth \ 2) > picThumb.Width Then
rX = picThumb.Width - RectWidth
Else
rX = rX - (RectWidth \ 2)
End If
rY = sY + dY
If rY - (RectHeight \ 2) < 0 Then
rY = 0
ElseIf rY + (RectHeight \ 2) > picThumb.Height Then
rY = picThumb.Height - RectHeight
Else
rY = rY - (RectHeight \ 2)
End If

e.Graphics.DrawRectangle(rectPen, rX, rY, RectWidth, RectHeight)
End Sub

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
''增加放大級數
intLavel += 1
DrawBigImage()
End Sub

Private Sub btnSub_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSub.Click
''減少放大級數
intLavel -= 1
If intLavel < 1 Then
intLavel = 1
rX = 0
rY = 0
End If
DrawBigImage()
End Sub
End Class

執行後的結果會長的像這樣

放大時的效果

留言

這個網誌中的熱門文章

開啟cshtml檔案時,出現『並未將物件參考設定為物件執行個體』的錯誤訊息

無法設定中斷點 尚未載入符號檔

DataGridView欄位計算總合