我正在为Xamarin开发IOS应用程序。我有一个菜单,其中我要求一个名为“Doublechecks”的东西。这些doublechecks有一个名为“Medication”的字段。在该应用程序的先前工作副本中,我只是使用一个字符串来填充此字段,但现在我们有了这样的想法,而不是用字符串填充此药物字段,以填充图像。我得到的一个提示是将拍摄或选择的图像转换为base64。
在我进行新的双重检查的菜单中,我有一个弹出动作表的按钮,您可以在其中选择要从PhotoLibrary中选择图像的天气,或者使用相机拍摄新照片。拍摄或选择照片后,我使用以下方法将其编码为Base64:
var imageToSend = originalImage.AsJPEG (0.23f).GetBase64EncodedString (NSDataBase64EncodingOptions.None);
原始图像是我拍摄/选择的图像。现在,在请求所有双重检查时,我使用以下内容对其进行解码:
byte[] encodedDataAsBytes = System.Convert.FromBase64String (imageToDisplay);
string decoded = System.Text.Encoding.ASCII.GetString (encodedDataAsBytes);
NSData data = NSData.FromString (decoded, NSStringEncoding.ASCIIStringEncoding);
return UIImage.LoadFromData (data);
该方法一直有效,直到返回。不知何故,UIImage没有被构造,并且其值为null,即使'data'包含已解码的字符串。
我搜索了几个主题和论坛,但没有多大用处。任何帮助将不胜感激。
答案 0 :(得分:4)
为什么要将base64 已解码数据转换为string
?
由于你已经拥有了字节数组,所以你应该能够做到:
byte[] encodedDataAsBytes = System.Convert.FromBase64String (imageToDisplay);
NSData data = NSData.FromArray (encodedDataAsBytes);
return UIImage.LoadFromData (data);
答案 1 :(得分:0)
NSData方法并不总是一个好的解决方案。您也可以尝试以下
var rawData = pixelMap.ToByteArray();
using (var provider = new CGDataProvider(rawData, 0, rawData.Length))
{
using (var colorSpace = CGColorSpace.CreateDeviceRGB())
{
var cgImage = new CGImage(
pixelMap.Width,
pixelMap.Height,
pixelMap.BitsPerComponent,
pixelMap.BytesPerPixel * ByteToBit,
pixelMap.BytesPerPixel * pixelMap.Width,
colorSpace,
CGBitmapFlags.ByteOrderDefault,
provider,
null,
true,
CGColorRenderingIntent.Default
);
return ImageSource.FromStream(() => UIImage.FromImage(cgImage).AsPNG().AsStream());
}
}
查看我的库和示例,了解有关Android和iOS位图的更多信息,从/到2d像素图。 https://github.com/enginkirmaci/Imaging-Library