2010-11-23 51 views
3

我拥有用于​​在手持设备上保存用户签名的应用程序的一部分。 我已经设法通过一个包含“点”阵列列表的“Lines”的数组列表来完成此操作。 我需要将这些信息存储在SQL数据库中。我见过的唯一信息就是使用图像数据类型并将其传递给一个字节数组。有问题。我会怎么做,或者有更好的方法?将点的ArrayList转换为字节数组以存储在SQL数据库中

回答

2

如果将此数据转换为图像,某些信息(哪一点属于哪一行)会丢失。如果你想保留这些信息,你应该序列化你的数据。

决定的格式:你可以使用一些非常详细,如XML ...

<Line> 
    <Point X="3" Y="4" /> 
    <Point X="3" Y="5" /> 
    ... 
</Line> 
<Line> 
    <Point X="10" Y="10" /> 
    ... 
</Line> 
... 

...或者一些基于文本的自定义格式:

3,4-3,5-...;10,10-...;... 

当然,您将以最高效的方式将数据存储在某种二进制编码中。

如果您使用基于文本(或XML)的格式,则您的序列化将产生一个字符串,您可以将其存储在SQL Server的varchar(MAX)text字段中。如果您决定使用二进制编码,则序列化将生成一个字节数组。为此,varbinary(MAX)image是选择的数据类型。请注意,名称image可能会引起误解:这并不是而是必然意味着您的数据被编码为“图像”(jpeg,png等)。

执行:对于XML和标准二进制编码,.NET提供了内置函数。这里的介绍和链接演练的MSDN:

如果你决定在一些自定义的基于文本或自定义的二进制编码,你需要自己编写序列化和反序列化部分。如果你需要帮助,你需要提供更多的信息:你的数据结构是如何精确的?你的X和Y坐标是什么数据类型?

1

因此,您让用户通过使用手写笔签名来创建位图图形? 声音对我来说是完全合理的把它作为图像存储。

create bitmap from array

+0

我试图将其保存为图像。这就是问题所在。我可以看到保存它的唯一方法是作为“图像”数据类型,它需要一个字节数组。我没有一个字节数组,我有一个xy点的负载 – MichaelMcCabe 2010-11-23 09:53:14

+0

好吧,我以为你会从一个位图开始,并从位图获取点列表。那么,如果有疑问:相信马克Gravell :) – 2010-11-24 17:04:26

2

这听起来像你想要某种形式的二进制序列化的;这里是一个使用protobuf网一个工作版本(注意,我改变ArrayListList<T>):

using System.Collections.Generic; 
using System.IO; 
using ProtoBuf; 
[ProtoContract] 
class Line 
{ 
    private readonly List<Point> points = new List<Point>(); 
    [ProtoMember(1, DataFormat = DataFormat.Group)] 
    public List<Point> Points { get { return points; } } 
} 
[ProtoContract] 
class Point 
{ 
    [ProtoMember(1)] 
    public int X { get; set; } 
    [ProtoMember(2)] 
    public int Y { get; set; } 
} 

static class Program 
{ 
    static void Main() 
    { 
     var lines = new List<Line> { 
      new Line { Points = { 
        new Point { X = 1, Y = 2} 
      }}, 
      new Line { Points = { 
        new Point { X = 3, Y = 4}, 
        new Point { X = 5, Y = 6} 
      }}, 
     }; 
     byte[] raw; 
     // serialize 
     using (var ms = new MemoryStream()) 
     { 
      Serializer.Serialize(ms, lines); 
      raw = ms.ToArray(); 
     } 
     List<Line> clone; 
     // deserialize 
     using (var ms = new MemoryStream(raw)) 
     { 
      clone = Serializer.Deserialize<List<Line>>(ms); 
     } 
    } 
} 
0

只需要从您的资料黑白位图,然后使用.NET库中的位图转换为PNG图像:

MemoryStream pngbuffer = new MemoryStream(); 
Bitmap.Save(pngbuffer,ImageFormat.Png) 

并将其作为二进制数据存储。大多数数据库都有用于存储二进制数据的格式:PostgreSQL bytea,MySQL和Oracle blob,MSSQL图像等。

+0

为什么要转换为`PNG`? – Brad 2010-11-23 16:14:34

相关问题