1 #Region "Microsoft.VisualBasic::3758329d241d828305a99b884dcb4fc0, 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 OverloadsSub 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                 If Not value Is Nothing Then
80                     _Size = value.Size
81                     _Center = New Point(Size.Width / 2, Size.Height / 2)
82                 Else
83                     _Size = Nothing
84                     _Center = Nothing
85                 End If
86             End Set
87         End Property
88
89         Dim __innerImage As Image
90
91         Protected Sub New()
92         End Sub
93
94         Sub New(size As Size, fill As Color)
95             Dim base = size.CreateGDIDevice(fill)
96
97             Stroke = base.Stroke
98             Font = base.Font
99             ImageResource = base.ImageResource
100             Graphics = base.Graphics
101         End Sub
102
103         Sub New(context As Context)
104             Call Me.New(context.size, context.color.TranslateColor)
105         End Sub
106
107         ''' <summary>
108         ''' Can be serialize as a XML file node.
109         ''' </summary>
110         Public Structure Context
111             Dim size As Size
112             Dim color$
113
114             Public Function Create() As Graphics2D
115                 Return size.CreateGDIDevice(color.TranslateColor)
116             End Function
117         End Structure
118
119         Public ReadOnly Property Width As Integer
120             Get
121                 Return Size.Width
122             End Get
123         End Property
124
125         Public ReadOnly Property Height As Integer
126             Get
127                 Return Size.Height
128             End Get
129         End Property
130
131         ''' <summary>
132         ''' Gets the width and height, in pixels, of this <see cref="ImageResource"/>.(图像的大小)
133         ''' </summary>
134         ''' <returns>A <see cref="System.Drawing.Size"/> structure that represents the width and height, in pixels,
135         ''' of this image.</returns>
136         Public Overrides ReadOnly Property Size As Size
137
138         ''' <summary>
139         ''' 在图象上面的中心的位置点
140         ''' </summary>
141         ''' <returns></returns>
142         Public ReadOnly Property Center As Point
143
144         ''' <summary>
145         ''' 将GDI+设备之中的图像数据保存到指定的文件路径之中,默认的图像文件的格式为PNG格式
146         ''' </summary>
147         ''' <param name="Path"></param>
148         ''' <param name="Format">默认为png格式</param>
149         ''' <returns></returns>
150         Public Overloads Function Save(path$, Optional Format As ImageFormats = ImageFormats.Png) As Boolean
151             Return Save(path, Format.GetFormat)
152         End Function
153
154         ''' <summary>
155         ''' 将GDI+设备之中的图像数据保存到指定的文件路径之中,默认的图像文件的格式为PNG格式
156         ''' </summary>
157         ''' <param name="Path"></param>
158         ''' <param name="Format">默认为png格式</param>
159         ''' <returns></returns>
160         Public Overloads Function Save(path$, Optional Format As ImageFormat = NothingAs Boolean
161             Try
162                 Call __save(path, Format Or Png)
163             Catch ex As Exception
164                 Return App.LogException(ex, MethodBase.GetCurrentMethod.GetFullName)
165             End Try
166
167             Return True
168         End Function
169
170         Private Sub __save(path As String, format As ImageFormat)
171             Call path.ParentPath.MkDIR
172             Call ImageResource.Save(path, format)
173         End Sub
174
175         Public Overrides Function ToString() As String
176             Return Size.ToString
177         End Function
178
179         ''' <summary>
180         ''' 
181         ''' </summary>
182         ''' <param name="r"></param>
183         ''' <param name="filled">所填充的颜色</param>
184         ''' <returns></returns>
185         Public Shared Function CreateDevice(r As Size, Optional filled As Color = NothingAs Graphics2D
186             Return r.CreateGDIDevice(filled)
187         End Function
188
189         ''' <summary>
190         ''' Get the internal <see cref="ImageResource"/>
191         ''' </summary>
192         ''' <param name="g2D"></param>
193         ''' <returns></returns>
194         Public Shared Narrowing Operator CType(g2D As Graphics2D) As Image
195             Return g2D.ImageResource
196         End Operator
197
198         Public Shared Widening Operator CType(img As Image) As Graphics2D
199             Dim g As Graphics = Graphics.FromImage(img)
200             Return CreateObject(g, res:=img)
201         End Operator
202
203         Public Shared Widening Operator CType(img As Bitmap) As Graphics2D
204             Dim g As Graphics = Graphics.FromImage(img)
205             Return CreateObject(g, img)
206         End Operator
207
208         ''' <summary>
209         ''' Internal create gdi device helper.(这个函数不会克隆原来的图像对象<paramref name="res"/>)
210         ''' </summary>
211         ''' <param name="g"></param>
212         ''' <param name="res">绘图的基础图像对象</param>
213         ''' <returns></returns>
214         Friend Shared Function CreateObject(g As Graphics, res As Image) As Graphics2D
215             With New Graphics2D With {
216                 .ImageResource = res,
217                 .g = g,
218                 .Font = New Font(FontFace.MicrosoftYaHei, 12),
219                 .Stroke = Pens.Black,
220                 .InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic,
221                 .PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality,
222                 .CompositingQuality = Drawing2D.CompositingQuality.HighQuality,
223                 .SmoothingMode = Drawing2D.SmoothingMode.HighQuality,
224                 .TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
225             }
226                 ' .Clear(Color.Transparent)
227                 Return .ByRef
228             End With
229         End Function
230
231         ''' <summary>
232         ''' Creates a new <see cref="System.Drawing.Graphics"/> from the specified <see cref="Image"/>.
233         ''' </summary>
234         ''' <param name="image">
235         ''' <see cref="Image"/> from which to create the new System.Drawing.Graphics.
236         ''' </param>
237         ''' <returns>
238         ''' This method returns a new <see cref="System.Drawing.Graphics"/> for the specified <see cref="Image"/>.
239         ''' </returns>
240         Public Shared Function Open(image As Image) As Graphics2D
241             Dim g As Graphics = Graphics.FromImage(image)
242             Return Graphics2D.CreateObject(g, image)
243         End Function
244
245         Public Overrides Sub DrawCircle(center As PointF, fill As Color, stroke As Pen, radius As Single)
246             Throw New NotImplementedException()
247         End Sub
248     End Class
249 End Namespace