我们开发一个简单的图片编辑器,包含有以下几个功能:
- 图片放大缩小
- 图片旋转
- 区域截图
- 绘制箭头
- 绘制方框
- 绘制文字
- 绘制涂鸦
首先我们解决最简单的,图片放大和缩小:
G_All.DrawImage(IM_Input, R_2, R_1, GraphicsUnit.Pixel)
下面截取一下原函数的解释:
解决图片的旋转
#Region "旋转"
''' <summary>
''' 旋转图片
''' </summary>
''' <param name="bmp">输入图片</param>
''' <param name="angle">旋转的度数</param>
''' <param name="bkColor">旋转的填充颜色,默认透明</param>
''' <returns>返回旋转后图像</returns>
''' <remarks></remarks>
Public Function KiRotate(bmp As Bitmap, angle As Single, Optional bkColor As Color = Nothing) As Bitmap
Dim w As Integer = bmp.Width + 2
Dim h As Integer = bmp.Height + 2
Dim pf As PixelFormat
If IsNothing(bkColor) Then bkColor = Color.Transparent
If bkColor = Color.Transparent Then
pf = PixelFormat.Format32bppArgb
Else
pf = bmp.PixelFormat
End If
Dim tmp As New Bitmap(w, h, pf)
Dim mtrx As New Matrix()
mtrx.Rotate(angle)
Dim path As New GraphicsPath()
path.AddRectangle(New RectangleF(0.0F, 0.0F, w, h))
Dim rct As RectangleF = path.GetBounds(mtrx)
Dim dst As New Bitmap(CInt(rct.Width), CInt(rct.Height), pf)
Dim g As Graphics = Graphics.FromImage(tmp)
g.Clear(bkColor)
g.DrawImageUnscaled(bmp, 1, 1)
g.Dispose()
g = Graphics.FromImage(dst)
g.Clear(bkColor)
g.TranslateTransform(-rct.X, -rct.Y)
g.RotateTransform(angle)
g.InterpolationMode = InterpolationMode.HighQualityBilinear
g.DrawImageUnscaled(tmp, 0, 0)
g.Dispose()
mtrx.Dispose()
path.Dispose()
tmp.Dispose()
Return dst
End Function
#End Region
旋转方法涉及到方法很多,我也是找的,未做深入理解.
要实现区域截图需要也很简单,和图片的放大缩小用的是一个重载方法.
G_this.DrawImage(IM_All, drawR_out_2, drawR_out_1, GraphicsUnit.Pixel)
绘制方案:
- 在MouseDown记录下绘制的起点
- 在MouseMove修改绘制的终点
- 在MouseUp完成绘制
绘制箭头,
Using p As New Pen(Color.Red, UC_Tool.LineWidth)
G_Draw.SmoothingMode = SmoothingMode.AntiAlias
p.StartCap = LineCap.Round
p.EndCap = LineCap.ArrowAnchor
G_Draw.DrawLine(p, item.P1x - 偏移x, item.P1y - 偏移y, item.P2x - 偏移x, item.P2y - 偏移y)
End Using
绘制方框
G_Draw.DrawRectangle(p, Rect)
绘制文字
G_Draw.DrawString(item.Str, New Font("宋体", 9), Brushes.Red, Rect, F)
绘制涂鸦
Using p_width As New Pen(Color.Red, UC_Tool.LineWidth)
For Each item In Draw_涂鸦s
Dim LinePoints As New List(Of Point)
LinePoints.Add(New Point(item.C_DrawInfo.P1x - 偏移x, item.C_DrawInfo.P1y - 偏移y))
For Each p In item.Points
LinePoints.Add(New Point(p.X - 偏移x, p.Y - 偏移y))
Next
If item.C_DrawInfo.P2End = True Then LinePoints.Add(New Point(item.C_DrawInfo.P2x - 偏移x, item.C_DrawInfo.P2y - 偏移y))
If LinePoints.Count > 1 Then
G_Draw.DrawLines(p_width, LinePoints.ToArray)
End If
Next
End Using
```