【问题标题】:Xamarin.Forms MemoryStream Manipulation. Why is Android different from iOS?Xamarin.Forms MemoryStream 操作。为什么Android与iOS不同?
【发布时间】:2016-06-15 20:43:00
【问题描述】:

所以我使用 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));

有人知道为什么会有差异吗?

【问题讨论】:

  • 在这个例子中是 System.IO.Stream。
  • 你不懂。在将它们转换为 System.IO.Stream 之前,我想知道 android 中的“theStream”和 ios 中的“theStream”的类型?

标签: xamarin xamarin.forms memorystream signaturepad


【解决方案1】:

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

主要区别在于,在 Android 上您会获得一个 Bitmap 对象,而在 iOS 上您会从 SignaturePad 的 GetImage() 方法获得一个 UIImage 对象。请参阅here for Android GetImagehere for iOS GetImage()

iOS

让我们先深入了解UIImage (see UIImage here)。

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

看看NSDataAPI reference,它有一个ToStream()方法,它返回一个Stream对象。

安卓

好的,现在进入 Android!

我找到了Bitmap API docs here。您可以得到另一个 Bitmap(来自 CreateBitmap 方法)、一个 Buffer(来自 CopyBuffer 方法)或 Compress / CompressAsync

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

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

希望这有助于阐明 SignaturePad 在为您提供图像时在做什么。

【讨论】:

  • 在 android 上,您可以使用 var stream = new System.IO.MemoryStream(); imageBitpmap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream); 更新您的答案来获取流。
  • 这非常有见地。谢谢兰斯。
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多