我需要一些关于.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中有些东西不能正常工作......
答案 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;
}
但我仍有同样的问题:原始图像和重建图像不同: - (
第二个是不完整的,只有几个中风。