2010-11-23 36 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

相關問題