2010-11-23 2 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 bytea, MySQL 및 Oracle BLOB, MSSQL 이미지 등

+0

왜 PNG로 변환 하시겠습니까? – Brad

+0

왜 안 되니? 이것은 자유롭고 (무료에서와 같이) 형식이 잘 압축되어있어 이미지를 무손실로 빠르게 표시 할 수있는 정상 프로그램마다 표시됩니다. 압축되지 않은 비트 맵으로 이미지를 저장하는 것은 90 년대입니다. – Tometzky

관련 문제