views:

171

answers:

1

I have a SQLite database which is running on a handheld which is capturing signatures using OpenNetCF's Smart Device Framework 2.1 running under Windows Mobile 6.1. The signatures are captured from the Signature control using the GetSignatureEx method and stored in the database.

What I want to do now is reconstitute the signatures on the desktop, but the desktop does not have a similar control. I looked at the data and it looks like a bunch of vectors, which explains why the data is so compact.

Does anyone have any idea how I can convert the data into a bitmap on the desktop using VB.NET. Thanks.

Colin

A: 

Found what I wanted on an OpenNetCF forum. The code was originally in C#, but didn't take too long to convert it to VB.NET. This code has been tested on version 2.0 and 2.1 of the OpenNetCF framework, but it will apparently work with version 1.4. Colin

Public Function GetSignature(ByVal arrsig As Byte(), ByVal backcolor As System.Drawing.Color)
    Dim pic As System.Windows.Forms.PictureBox
    Dim word As Integer
    Dim lngIndex As Integer
    Dim lngPointsToRead As Integer = 0
    Dim lngCurrX As Integer = -1
    Dim lngCurrY As Integer = -1
    Dim lngPrevX As Integer = -1
    Dim lngPrevY As Integer = -1
    Dim lngWidth As Integer = 1
    Dim lngHeight As Integer
    Dim bit As New System.Drawing.Bitmap(1, 1)
    Dim g As Graphics = Graphics.FromImage(bit)
    pic = New picturebox()
    Dim blackpen As New Pen(Color.Black)
    If arrsig.Length < 3 Then
        Return Nothing
    End If
    word = arrsig(0)
    word = word + System.Convert.ToInt32(arrsig(1)) * 256
    lngWidth = word
    word = arrsig(2)
    word = word + System.Convert.ToInt32(arrsig(3)) * 256
    lngHeight = word
    bit = New Bitmap(lngWidth, lngHeight)
    g = Graphics.FromImage(bit)
    g.Clear(backcolor)
    lngIndex = 4
    While (True)
        If (lngIndex >= arrsig.Length) Then
            Exit While
        End If
        If (lngPointsToRead = 0) Then
            word = arrsig(lngIndex)
            lngIndex = lngIndex + 1
            word = word + System.Convert.ToInt32(arrsig(lngIndex)) * 256
            lngPointsToRead = word
            lngPrevX = -1
            lngPrevY = -1
        Else
            If (lngCurrX = -1) Then
                word = arrsig(lngIndex)
                If (lngWidth > 255) Then
                    lngIndex = lngIndex + 1
                    word = word + System.Convert.ToInt32(arrsig(lngIndex)) * 256
                End If
                lngCurrX = word
            ElseIf (lngCurrY = -1) Then
                word = arrsig(lngIndex)
                If (lngHeight > 255) Then
                    lngIndex = lngIndex + 1
                    word = word + System.Convert.ToInt32(arrsig(lngIndex)) * 256
                End If
                lngCurrY = word
                lngPointsToRead = lngPointsToRead - 1
                If (lngPrevX <> -1) Then
                    g.DrawLine(blackpen, lngPrevX, lngPrevY, lngCurrX, lngCurrY)
                End If
                lngPrevX = lngCurrX
                lngPrevY = lngCurrY
                lngCurrX = -1
                lngCurrY = -1
            End If
        End If
        lngIndex = lngIndex + 1
    End While
    pic.Image = bit
    Return pic.Image
End Function
CDM