2010-11-23 9 views
3

私はハンドヘルドデバイス上にユーザーの署名を保存するために使用されるアプリケーションの一部を持っています。 私は "点"のarraylistを含む "線"のarraylistを持つことによってこれを行うことができました。 この情報を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座標はどのようなデータ型ですか?

+0

私はこのようにしてしまった。ありがとうHeinzi – MichaelMcCabe

1

スタイラスで署名してビットマップグラフィックを作成できるようにしましたか? これを画像として保存するには、私にとって完全に妥当な音です。

create bitmap from array

+0

私はイメージとして保存しようとしています。それが問題です。私はそれを保存することができます唯一の方法は、バイト配列が必要な "イメージ"データ型としてです。私はバイト配列を持っていない、私はxyの点の負荷を持っている – MichaelMcCabe

+0

私はあなたがビットマップから開始し、ビットマップからポイントリストを取得すると思った。まあ、間違っている場合:Marc Gravellを信頼してください:) –

2

あなたがバイナリシリアルのいくつかのフォームを望むように聞こえます。

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画像へのあなたのビットマップを変換します:ここにいるProtobufネットを使用して作業バージョンです(私はList<T>ArrayListを変更注意してください)

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

バイナリデータとして保存します。ほとんどのデータベースはバイナリデータを格納するための形式を持っています:PostgreSQLバイト、MySQLとOracle BLOB、MSSQLイメージなど

+0

なぜ 'PNG'に変換しますか? – Brad

+0

なぜですか?これは自由で(自由のように)、よく圧縮され、画像を無損失かつ高速に表示できるあらゆる正当なプログラムによって表示される形式です。圧縮されていないビットマップとして画像を保存することは90年代です。 – Tometzky

関連する問題