1 | #Region "Microsoft.VisualBasic::2859828fb18f77637487d9fdec0ee388, Microsoft.VisualBasic.Core\Extensions\Image\GDI+\Graphics2D.vb" |
2 | |
3 | ' Author: |
4 | ' |
5 | ' asuka (amethyst.asuka@gcmodeller.org) |
6 | ' xie (genetics@smrucc.org) |
7 | ' xieguigang (xie.guigang@live.com) |
8 | ' |
9 | ' Copyright (c) 2018 GPL3 Licensed |
10 | ' |
11 | ' |
12 | ' GNU GENERAL PUBLIC LICENSE (GPL3) |
13 | ' |
14 | ' |
15 | ' This program is free software: you can redistribute it and/or modify |
16 | ' it under the terms of the GNU General Public License as published by |
17 | ' the Free Software Foundation, either version 3 of the License, or |
18 | ' (at your option) any later version. |
19 | ' |
20 | ' This program is distributed in the hope that it will be useful, |
21 | ' but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | ' GNU General Public License for more details. |
24 | ' |
25 | ' You should have received a copy of the GNU General Public License |
26 | ' along with this program. If not, see <http://www.gnu.org/licenses/>. |
27 | |
28 | |
29 | |
30 | ' /********************************************************************************/ |
31 | |
32 | ' Summaries: |
33 | |
34 | ' Class Graphics2D |
35 | ' |
36 | ' Properties: Center, Height, ImageResource, Size, Width |
37 | ' |
38 | ' Constructor: (+3 Overloads) Sub New |
39 | ' |
40 | ' Function: CreateDevice, CreateObject, Open, (+2 Overloads) Save, ToString |
41 | ' |
42 | ' Sub: __save, DrawCircle |
43 | ' Structure Context |
44 | ' |
45 | ' Function: Create |
46 | ' |
47 | ' |
48 | ' |
49 | ' |
50 | ' /********************************************************************************/ |
51 | |
52 | #End Region |
53 | |
54 | Imports System.Drawing |
55 | Imports System.Drawing.Imaging |
56 | Imports System.Reflection |
57 | Imports Microsoft.VisualBasic.Language |
58 | |
59 | Namespace Imaging |
60 | |
61 | ''' <summary> |
62 | ''' GDI+ device handle for encapsulates a GDI+ drawing surface. |
63 | ''' (GDI+绘图设备句柄,这个对象其实是为了将gdi+绘图与图形模块的SVG绘图操作统一起来的) |
64 | ''' </summary> |
65 | ''' <remarks></remarks> |
66 | Public Class Graphics2D : Inherits GDICanvas |
67 | Implements IDisposable |
68 | |
69 | ''' <summary> |
70 | ''' GDI+ device handle memory.(GDI+设备之中的图像数据) |
71 | ''' </summary> |
72 | ''' <remarks></remarks> |
73 | Public Property ImageResource As Image |
74 | Get |
75 | Return innerImage |
76 | End Get |
77 | Protected Friend Set(value As Image) |
78 | innerImage = value |
79 | |
80 | If Not value Is Nothing Then |
81 | _Size = value.Size |
82 | _Center = New Point(Size.Width / 2, Size.Height / 2) |
83 | Else |
84 | _Size = Nothing |
85 | _Center = Nothing |
86 | End If |
87 | End Set |
88 | End Property |
89 | |
90 | Dim innerImage As Image |
91 | |
92 | Protected Sub New() |
93 | End Sub |
94 | |
95 | Sub New(size As Size, fill As Color) |
96 | Dim base = size.CreateGDIDevice(fill) |
97 | |
98 | Stroke = base.Stroke |
99 | Font = base.Font |
100 | ImageResource = base.ImageResource |
101 | Graphics = base.Graphics |
102 | End Sub |
103 | |
104 | Sub New(context As Context) |
105 | Call Me.New(context.size, context.color.TranslateColor) |
106 | End Sub |
107 | |
108 | ''' <summary> |
109 | ''' Can be serialize as a XML file node. |
110 | ''' </summary> |
111 | Public Structure Context |
112 | Dim size As Size |
113 | Dim color$ |
114 | |
115 | Public Function Create() As Graphics2D |
116 | Return size.CreateGDIDevice(color.TranslateColor) |
117 | End Function |
118 | End Structure |
119 | |
120 | Public ReadOnly Property Width As Integer |
121 | Get |
122 | Return Size.Width |
123 | End Get |
124 | End Property |
125 | |
126 | Public ReadOnly Property Height As Integer |
127 | Get |
128 | Return Size.Height |
129 | End Get |
130 | End Property |
131 | |
132 | ''' <summary> |
133 | ''' Gets the width and height, in pixels, of this <see cref="ImageResource"/>.(图像的大小) |
134 | ''' </summary> |
135 | ''' <returns>A <see cref="System.Drawing.Size"/> structure that represents the width and height, in pixels, |
136 | ''' of this image.</returns> |
137 | Public Overrides ReadOnly Property Size As Size |
138 | |
139 | ''' <summary> |
140 | ''' 在图象上面的中心的位置点 |
141 | ''' </summary> |
142 | ''' <returns></returns> |
143 | Public ReadOnly Property Center As Point |
144 | |
145 | ''' <summary> |
146 | ''' 将GDI+设备之中的图像数据保存到指定的文件路径之中,默认的图像文件的格式为PNG格式 |
147 | ''' </summary> |
148 | ''' <param name="Path"></param> |
149 | ''' <param name="Format">默认为png格式</param> |
150 | ''' <returns></returns> |
151 | Public Overloads Function Save(path$, Optional Format As ImageFormats = ImageFormats.Png) As Boolean |
152 | Return Save(path, Format.GetFormat) |
153 | End Function |
154 | |
155 | ''' <summary> |
156 | ''' 将GDI+设备之中的图像数据保存到指定的文件路径之中,默认的图像文件的格式为PNG格式 |
157 | ''' </summary> |
158 | ''' <param name="Path"></param> |
159 | ''' <param name="Format">默认为png格式</param> |
160 | ''' <returns></returns> |
161 | Public Overloads Function Save(path$, Optional Format As ImageFormat = Nothing) As Boolean |
162 | Try |
163 | Call __save(path, Format Or Png) |
164 | Catch ex As Exception |
165 | Return App.LogException(ex, MethodBase.GetCurrentMethod.GetFullName) |
166 | End Try |
167 | |
168 | Return True |
169 | End Function |
170 | |
171 | Private Sub __save(path As String, format As ImageFormat) |
172 | Call path.ParentPath.MkDIR |
173 | Call ImageResource.Save(path, format) |
174 | End Sub |
175 | |
176 | Public Overrides Function ToString() As String |
177 | Return Size.ToString |
178 | End Function |
179 | |
180 | ''' <summary> |
181 | ''' |
182 | ''' </summary> |
183 | ''' <param name="r"></param> |
184 | ''' <param name="filled">所填充的颜色</param> |
185 | ''' <returns></returns> |
186 | Public Shared Function CreateDevice(r As Size, Optional filled As Color = Nothing) As Graphics2D |
187 | Return r.CreateGDIDevice(filled) |
188 | End Function |
189 | |
190 | ''' <summary> |
191 | ''' Get the internal <see cref="ImageResource"/> |
192 | ''' </summary> |
193 | ''' <param name="g2D"></param> |
194 | ''' <returns></returns> |
195 | Public Shared Narrowing Operator CType(g2D As Graphics2D) As Image |
196 | Return g2D.ImageResource |
197 | End Operator |
198 | |
199 | Public Shared Widening Operator CType(img As Image) As Graphics2D |
200 | Dim g As Graphics = Graphics.FromImage(img) |
201 | Return CreateObject(g, res:=img) |
202 | End Operator |
203 | |
204 | Public Shared Widening Operator CType(img As Bitmap) As Graphics2D |
205 | Dim g As Graphics = Graphics.FromImage(img) |
206 | Return CreateObject(g, img) |
207 | End Operator |
208 | |
209 | ''' <summary> |
210 | ''' Internal create gdi device helper.(这个函数不会克隆原来的图像对象<paramref name="res"/>) |
211 | ''' </summary> |
212 | ''' <param name="g"></param> |
213 | ''' <param name="res">绘图的基础图像对象</param> |
214 | ''' <returns></returns> |
215 | Friend Shared Function CreateObject(g As Graphics, res As Image) As Graphics2D |
216 | With New Graphics2D With { |
217 | .ImageResource = res, |
218 | .g = g, |
219 | .Font = New Font(FontFace.MicrosoftYaHei, 12), |
220 | .Stroke = Pens.Black, |
221 | .InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic, |
222 | .PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality, |
223 | .CompositingQuality = Drawing2D.CompositingQuality.HighQuality, |
224 | .SmoothingMode = Drawing2D.SmoothingMode.HighQuality, |
225 | .TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit |
226 | } |
227 | ' .Clear(Color.Transparent) |
228 | Return .ByRef |
229 | End With |
230 | End Function |
231 | |
232 | ''' <summary> |
233 | ''' Creates a new <see cref="System.Drawing.Graphics"/> from the specified <see cref="Image"/>. |
234 | ''' </summary> |
235 | ''' <param name="image"> |
236 | ''' <see cref="Image"/> from which to create the new System.Drawing.Graphics. |
237 | ''' </param> |
238 | ''' <returns> |
239 | ''' This method returns a new <see cref="System.Drawing.Graphics"/> for the specified <see cref="Image"/>. |
240 | ''' </returns> |
241 | Public Shared Function Open(image As Image) As Graphics2D |
242 | Dim g As Graphics = Graphics.FromImage(image) |
243 | Return Graphics2D.CreateObject(g, image) |
244 | End Function |
245 | |
246 | Public Overrides Sub DrawCircle(center As PointF, fill As Color, stroke As Pen, radius As Single) |
247 | Throw New NotImplementedException() |
248 | End Sub |
249 | End Class |
250 | End Namespace |