Преобразование OpenNetCF GetSignatureEx в растровое изображение на рабочем столе - PullRequest
0 голосов
/ 01 мая 2009

У меня есть база данных SQLite, которая работает на контроллере, который собирает подписи с помощью OpenNetCF Smart Device Framework 2.1, работающем под Windows Mobile 6.1. Подписи собираются из элемента управления Signature с помощью метода GetSignatureEx и сохраняются в базе данных.

Теперь я хочу восстановить подписи на рабочем столе, но рабочий стол не имеет аналогичного элемента управления. Я посмотрел на данные, и они выглядят как набор векторов, что объясняет, почему данные такие компактные.

Кто-нибудь знает, как я могу преобразовать данные в растровое изображение на рабочем столе, используя VB.NET. Спасибо.

1 Ответ

0 голосов
/ 04 июля 2009

На форуме OpenNetCF я нашел то, что хотел. Код изначально был на C #, но его преобразование в VB.NET не заняло много времени. Этот код был протестирован на версиях 2.0 и 2.1 платформы OpenNetCF, но он, очевидно, будет работать с версией 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
...