2014-03-05 84 views
0

我需要一些關於.net方法來轉換jsignature導出數據的幫助。 我有一個Android應用程序發送的壓縮數據(例如,「quaok1C2S3Q3W3A2A2I1Uk1y800Z6c1y1y1W2G2w2C2u1O1M1wie800Y2ccm1A1C1Q1S1U2G2y2M1O1u1y4424681y1C1Q2M2Q2w2A2woce_dC200Z2688408ccoeiamiga800000Y48gic1u1ucmaes866402000Z224420000000000002」) ,爲了將它們保存到數據庫,並做一些業務receving數據.NET Web服務(REST)base30。 目前我正在嘗試將數據從base30轉換爲image的一些問題。例如,我指的是jsignature zip(https://github.com/willowsystems/jSignature)的「extras」文件夾中的SignatureDataConversion_dotNet代碼,以便進行轉換和管理數據。 但事情是不是爲我工作...或者,也許,我還沒有完全瞭解如何在.net使用C#從jsignature轉換base30圖像

管理base30簽名這一塊的代碼我使用:

Base30Converter conv = new Base30Converter(); 
int[][][] bytearray = conv.GetData(base30_string_from_app); 
string actual = jSignature.Tools.SVGConverter.ToSVG(bytearray); 
var byteArray = Encoding.ASCII.GetBytes(actual); 
using (var stream = new MemoryStream(byteArray)) 
{ 
    var svgDocument = SvgDocument.Open(stream); 
    var bitmap = svgDocument.Draw(); 
    bitmap.Save("D:\prova.png", ImageFormat.Png); 
} 

但我得到的圖像似乎是整個簽名發送的「分區」,只有一些筆畫。 我也檢查了我操縱的字符串:它與應用程序發送的內容相同。 作爲對此的確認,我在使用jSignature「setData」方法將其導入到html畫布中成功。

預先感謝任何幫助


如同base30轉換的可能問題的另一個例子在.NET中的SVG,我們這裏有一個簽名exportet的SVG轉換從http://willowsystems.github.io/jSignature/#/demo/

[SVG] [HTTPS://] dl.dropboxusercontent.com/u/77767500/SVG_from_jsignature_site.svg

這是相同符號的基體30的轉換:

7yf1Ul1H4232121Z4577dabdllhhne1uf6423Y2587ddn1v1x1G1A1D1wpordd8431Z1338ffppkm1v1Db964210Y158b46ffgqkhqfef8673523_3EZ2519332455410Y315329745ba9me5343421200100000Z22345233345323311000Y142853746743121000Z10041112224332_jVZ746ba553200Y12368cabceb8a74200Z234a4ebcebfdbc65Y68afjdjd9f864334_4SZ110000Y3368745322000000Z1123355584323113000000Y31Z101101201001221

嘗試使用其轉換

Base30Converter conv = new Base30Converter(); 
int[][][] bytearray = conv.GetData(stream_to_convert); 
string actual = jSignature.Tools.SVGConverter.ToSVG(bytearray); 

我得到:

[https://開頭] dl.dropboxusercontent.com/u/77767500/SVG_from_jsignature_lib.svg

正如你可以看到兩個「SVG」轉換似乎是不同的。 因此,也許,在jSignature.Tools中有一些工作不正常.Net ...

回答

2

這使我在jSignature包中包含的.NET工具花費了大量的嘗試和錯誤,但是這裏是我最終得到它從base30 jSignature字符串生成一個PNG。我使用VB .NET和返回System.Drawing.Image對象(可以輸出但是你想要的):

Public Function GetSignaturePNG() As System.Drawing.Image 
    'jSignature conversion from base30 to SVG    
    Dim base30Converter As New jSignature.Tools.Base30Converter() 
    Dim arrBase30Data As Integer()()() = base30Converter.GetData(Me.SigBase30) 'our original base30 string 
    Dim strSVG As String = jSignature.Tools.SVGConverter.ToSVG(arrBase30Data) 

    'first convert it to SVG 
    Dim mySVG As SvgDocument 
    Dim newStream As New System.IO.MemoryStream(System.Text.ASCIIEncoding.[Default].GetBytes(strSVG)) 
    mySVG = SvgDocument.Open(newStream, Nothing)  

    'then convert it to PNG 
    Dim tempStream As New System.IO.MemoryStream() 
    mySVG.Draw().Save(tempStream, System.Drawing.Imaging.ImageFormat.Png) 
    Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(tempStream) 

    Return img 
End Function 

更新二零一四年六月二十零日:獅子座,我是能夠成功地導出base30簽名字符串(在你原來的問題中列出)作爲SVG和PNG。我得到了整個「獅子座」簽名,而不僅僅是幾筆破碎的筆畫。所以我不確定我們做了什麼不同。你確定你將整個base30字符串傳遞給函數嗎?

0

感謝Adrockski爲您的時間和幫助。 我試過您的解決方案轉換成C#作爲:

private Image GetSignaturePNG(string pStream_to_convert) 
    { 
     Base30Converter conv = new Base30Converter(); 
     int[][][] arrBase30Data = conv.GetData(pStream_to_convert); 

     string strSVG = jSignature.Tools.SVGConverter.ToSVG(arrBase30Data); 

     var s = new MemoryStream(Encoding.ASCII.GetBytes(strSVG)); 
     SvgDocument mySVG = SvgDocument.Open(s, null); 

     var tempStream = new System.IO.MemoryStream(); 
     mySVG.Draw().Save(tempStream, System.Drawing.Imaging.ImageFormat.Png); 
     System.Drawing.Image img = System.Drawing.Image.FromStream(tempStream); 
     return img; 
    } 

但我仍然有同樣的問題:原始圖像和重新建造的圖像是不同的:-(

第二個是不完整的,只有幾行程

1

SVGConverter類使用string.Format來輸出小數點到字符串如果你當前的文化是例如設置爲德語,它會輸出帶有逗號而不是點的分數因此,添加CultureInfo .InvariantCulture作爲該類中每個String.Format的第一個參數,以確保SVG輸出格式化爲小數點。

+0

這應該是被接受的答案。 – ulluoink