Xamarin 形成记忆流操纵。为什么Android与iOS不同?

Xamarin 形成记忆流操纵。为什么Android与iOS不同?,xamarin,xamarin.forms,memorystream,signaturepad,Xamarin,Xamarin.forms,Memorystream,Signaturepad,因此,我使用SignaturePad.PCL nuget包,您可以从插件中恢复一个流,该插件获取绘制点并创建图像。然后,我将该图像作为base64字符串传递给web服务,并在web应用程序中显示它。我发现我可以像这样转换成base64字符串 //This works on android but not iOS string base64Str = Convert.ToBase64String(((MemoryStream) theStream).ToArray()); //Works on

因此,我使用SignaturePad.PCL nuget包,您可以从插件中恢复一个流,该插件获取绘制点并创建图像。然后,我将该图像作为base64字符串传递给web服务,并在web应用程序中显示它。我发现我可以像这样转换成base64字符串

//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));

有人知道为什么会有不同吗?

我快速查看了SignaturePad的源代码()并回顾了Android和iOS版本如何处理它创建的图像

主要的区别是,在Android上,你可以得到一个
位图
对象,而在iOS上,你可以从SignaturePad的
GetImage()
方法得到一个
UIImage
对象。见和

iOS

让我们先深入到
UIImage
first()

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

看看
NSData
,它有一个
ToStream()
方法,返回一个
对象

Android

好的,现在进入Android

我找到了
位图
。您可以获得另一个
位图
(来自CreateBitmap方法)、一个
缓冲区
(来自CopyBuffer方法)或
压缩
/
压缩同步

并让您传入一个可写流对象,如
MemoryStream
,作为第三个参数。下面是一个例子(来自jzeferino的评论):

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


希望这有助于澄清SignaturePad在为您提供图像时所做的操作。

从本例中可以看出,它是System.IO.Stream。您可能无法理解。我想知道android中的“theStream”和ios中的“theStream”的类型,然后再将它们转换为System.IO.Stream?在android上,您可以使用
var Stream=new System.IO.MemoryStream()获得流;imageBitpmap.Compress(位图.CompressFormat.Jpeg,100,流)更新你的答案。这是令人难以置信的洞察力。谢谢你,兰斯。