使用C#从jsignature转换base30图像

时间:2014-03-05 10:41:44

标签: c# javascript android image

我需要一些关于.net方法的帮助来转换jsignature导出的数据。 我有一个Android应用程序发送base30压缩数据(例如“quaok1C2S3Q3W3A2A2I1Uk1y800Z6c1y1y1W2G2w2C2u1O1M1wie800Y2ccm1A1C1Q1S1U2G2y2M1O1u1y4424681y1C1Q2M2Q2w2A2woce_dC200Z2688408ccoeiamiga800000Y48gic1u1ucmaes866402000Z224420000000000002”) 和.Net Web服务(其余)接收数据,以便将它们保存到数据库并进行一些业务。 目前我正在尝试将数据从base30转换为图像的一些问题。 例如,我指的是jsignature zip(https://github.com/willowsystems/jSignature)的“extras”文件夹中的SignatureDataConversion_dotNet代码,以便进行转换和管理数据。 但有些东西对我不起作用......或者,也许,我还没有完全理解如何在.Net中管理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画布上导入它时成功了。

提前感谢您提供任何帮助


作为.Net中base30转换为svg的可能问题的另一个例子,这里我们从http://willowsystems.github.io/jSignature/#/demo/

获得签名导出的svg转换

[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”转换似乎有所不同。 所以,也许,在.Net的jSignature.Tools中有些东西不能正常工作......

3 个答案:

答案 0 :(得分: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

更新6.20.2014:Leo,我能够成功导出您的base30签名字符串(在原始问题中列出)作为SVG和PNG。我得到了整个" leo"签名,而不仅仅是几个破碎的笔画。因此,我不确定我们的做法有何不同。你确定你将整个base30字符串传递给函数吗?

答案 1 :(得分:2)

SVGConverter类使用string.Format将小数输出到字符串。如果您目前的文化是设置为德语,它将使用逗号而不是点输出分数。因此,将CultureInfo.InvariantCulture添加为该类中每个String.Format的第一个参数,以确保SVG输出的格式为小数点。

答案 2 :(得分: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;
    }

但我仍有同样的问题:原始图像和重建图像不同: - (

第二个是不完整的,只有几个中风。