转自:http://www.codeproject.com/Articles/105570/InkCollector-Signiture-Made-Easy
The following article is useful when trying to import Ink into a database. I have tried to keep it as simple as possible.
I've successfully used this in my Access database that holds about 500 signatures; the average signature size is about 1500 characters. The largest one on record is 2853 and the smallest one on record is 1139. To store this in a Microsoft Access Database, you will need to save it in a memo field as the maximum number of characters in a Text field is 255.
Using the Code
First add the reference for Microsoft.Ink
to your VB Project, next create a group box on your form. Before your form class, add Imports Microsoft.Ink
so that a InkCollector
control can be created. First, define the InkCollector
control. Then, create the control from your form load sub
and give it the handle of your group box.
Your code should then look something like this:
Imports Microsoft.Ink 'Required for InkCollector
Public Class frmMain
Dim Sig_InkCollector As InkCollector 'The InkCollector
Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Sig_InkCollector = New InkCollector(GroupBox1.Handle)
Sig_InkCollector.Enabled = True
Sig_InkCollector.AutoRedraw = True
End Sub
End Class
I have just completed adding a function that converts the base64 string
to an image so that it can be attached to a RTF, HTML or printed easily.
To Clear the Signiture
Specify call the clear sub
from the Signiture
module, then specify the InkCollector
and the GroupBox
which contains the InkCollector
control.
Signiture.Clear(Sig_InkCollector, GroupBox1)
To Set the Signiture
To load a signiture Base64 string
into the inkCollector
, call the following Sub
, specify the InkCollector
and the GroupBox
which contains the InkCollector
control, then the Base64 String
.
Signiture.SetBase64(Sig_InkCollector, GroupBox1, TextBox1.Text)
To Get the Signiture
To read the Signiture
from the InkCollector
, call the following function and specify the InkCollector
. The Base64 String
will be returned.
Textbox1.Text = Signiture.GetBase64(Sig_InkCollector)
To Convert Base64 to Image
To convert a stored Base64InkSerializedFormat String
to an Image
, so that the signiture
can be displayed in a report.
PictureBox1.Image = Signiture.Base64toImage(TextBox1.Text)
Source
Imports Microsoft.Ink 'Required for InkPicture
Imports System.Text 'Required by UTF8Encoding
Imports System.IO 'Required by MemoryStream
''' <summary>
''' Signiture Made Easy Module
''' Created by Marco van der Merwe (22 September 2010)
''' </summary>
Module Signiture
''' <summary>
''' Returns String in Format(PersistenceFormat = Base64InkSerializedFormat)
''' </summary>
''' <param name="InkCollector"></param>
''' <returns> String Format(PersistenceFormat = Base64InkSerializedFormat)</returns>
''' <remarks></remarks>
Function GetBase64(ByVal InkCollector As InkCollector) As String
Dim utf8 As UTF8Encoding = New UTF8Encoding()
InkCollector.Enabled = False
Return utf8.GetString(InkCollector.Ink.Save_
(PersistenceFormat.Base64InkSerializedFormat, CompressionMode.Maximum))
InkCollector.Enabled = True
End Function
''' <summary>
''' Sets the Base 64 Ink from String
''' </summary>
''' <param name="InkCollector"></param>
''' <param name="GroupBox"></param>
''' <param name="Base64"></param>
''' <remarks></remarks>
Sub SetBase64(ByVal InkCollector As InkCollector, _
ByVal GroupBox As GroupBox, ByVal Base64 As String)
Dim loadedInk As Ink = New Ink()
Dim utf8 As UTF8Encoding = New UTF8Encoding()
InkCollector.Enabled = False
InkCollector.Ink.DeleteStrokes() ' Clear all strokes
loadedInk.Load(utf8.GetBytes(Base64))
InkCollector.Ink = loadedInk
InkCollector.Enabled = True
GroupBox.Invalidate()
End Sub
''' <summary>
''' Clear Signiture
''' </summary>
''' <param name="InkCollector"></param>
''' <param name="GroupBox"></param>
''' <remarks></remarks>
Sub Clear(ByVal InkCollector As InkCollector, ByVal GroupBox As GroupBox)
InkCollector.Enabled = False ' Disable InkPicture to clear
InkCollector.Ink.DeleteStrokes() ' Clear all strokes
GroupBox.Invalidate() ' Redraw frame
InkCollector.Enabled = True ' Reenale InkPicture for entry
End Sub
''' <summary>
''' Converts String Format(PersistenceFormat = Base64InkSerializedFormat)
''' to System.Drawing.Image
''' </summary>
''' <param name="Base64"></param>
''' <returns>System.Drawing.Image</returns>
''' <remarks></remarks>
Function Base64toImage(ByVal Base64 As String) As System.Drawing.Image
Dim utf8 As UTF8Encoding = New UTF8Encoding()
Dim imgSig As System.Drawing.Image
Dim tmploadedInk As Ink = New Ink()
Dim strGIF As String
Dim imageBytes() As Byte
Dim MS As MemoryStream
'Load the Base64 String in Format(PersistenceFormat = Base64InkSerializedFormat) as ink
tmploadedInk.Load(utf8.GetBytes(Base64))
'Convert the ink to Base64 String in format
'(PersistenceFormat.Gif, CompressionMode.Maximum)
strGIF = Convert.ToBase64String(tmploadedInk.Save_
(PersistenceFormat.Gif, CompressionMode.Maximum))
'Convert Base64 String to Byte Array
imageBytes = Convert.FromBase64String(strGIF)
MS = New MemoryStream(imageBytes, 0, imageBytes.Length)
' Convert byte[] to Image
MS.Write(imageBytes, 0, imageBytes.Length)
imgSig = Image.FromStream(MS, True)
Return imgSig
End Function
End Module
Points of Interest
I’ve tried everything with InkPicture
for about 3 weeks and had no results, until I started using InkCollector
. I had many unexplained errors and very little help with InkPicture
, this is far easier to use.
I know the Access Database gets quite large, but at least these signitures are secured by a password and my data is at least stored in the same database.
History
- Added Image Support, to convert
Base64InkSerializedFormat string
toImage