Xamarin 形成记忆流操纵。为什么Android与iOS不同?
因此,我使用SignaturePad.PCL nuget包,您可以从插件中恢复一个流,该插件获取绘制点并创建图像。然后,我将该图像作为base64字符串传递给web服务,并在web应用程序中显示它。我发现我可以像这样转换成base64字符串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
//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,流)代码>更新你的答案。这是令人难以置信的洞察力。谢谢你,兰斯。