1

因此,我正在使用 SignaturePad.PCL nuget 包,您可以从插件中恢复流,该插件采用绘制点并创建图像。然后,我将该图像作为 base 64 字符串传递给 Web 服务,并将其显示在 Web 应用程序中。好吧,我发现我能够像这样转换为 base 64 字符串

//This works on android but not iOS
string base64Str = Convert.ToBase64String(((MemoryStream) theStream).ToArray());


//Works on iOS but not android
string base64Str = Convert.ToBase64String(StreamConvert(theStream));
private byte[] StreamConvert(Stream stream){
  using (var ms = new MemoryStream())
        {
            stream.CopyTo(ms);
            return ms.ToArray();
        }​
     }


//For both I use this, unless someone else can figure out a cross platform solution
string base64Str = Convert.ToBase64String(Device.OS == TargetPlatform.Android ? ((MemoryStream) theStream).ToArray() : StreamConvert(theStream));

有谁知道为什么有区别?

4

1 回答 1

3

我快速浏览了 SignaturePad 的源代码(在此处找到)并查看了 Android 和 iOS 版本如何处理它创建的图像。

主要区别在于,在 Android 上您获得一个Bitmap对象,而在 iOS 上您UIImage从 SignaturePad 的GetImage()方法获得一个对象。Android GetImage参见此处,iOS GetImage()参见此处。

iOS

让我们先深入了解UIImage参见 UIImage here)。

看看如何UIImage生成它的图像,你会发现有几种方法可以返回一个NSData对象:ToJPEG()ToPNG().

看一下NSData API 参考,它有一个ToStream()返回Stream对象的方法。

安卓

好的,现在进入Android!

我在Bitmap 这里找到了 API 文档。您要么得到另一个Bitmap(来自 CreateBitmap 方法),要么得到一个Buffer(来自 CopyBuffer 方法)或Compress/ CompressAsync

CompressCompressAsync让您可以像MemoryStream第三个参数一样传入一个可写的流对象。这是一个示例(来自 jzeferino 的评论):

var stream = new System.IO.MemoryStream(); imageBitpmap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);

希望这有助于阐明 SignaturePad 在为您提供图像时所做的事情。

于 2016-06-15T21:46:33.497 回答