天天看点

InkCollector Signiture Made Easy

转自: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.

InkCollector Signiture Made Easy

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

    to

    Image