如果您想要的是图像的字符串表示形式,那么首先您需要从该图像中获取bytes,然后将其转换为字符串格式,例如Base64
但首先我们需要从图像中获取字节,Xamarin.Forms 的图像是一个View,其中包含一个Source
public class Image : View, IImageController, IElementConfiguration<Image>
{
public ImageSource Source { get; set; }
}
该源用于加载将显示的图像,我们有一些ImageSource(FileImageSource,StreamImageSource,UriImageSource)但如果我没记错的话,目前没有办法转换ImageSource 到 Xamarin.Forms 中的bytes,但我们可以使用本机代码来处理此类
安卓
在 Android 中,我们可以使用 IImageSourceHandler 将 ImageSource 转换为 Bitmap 并将 Bitmap 转换为字节
[assembly: Dependency(typeof(ImageLoader))]
public class ImageLoader : IImageLoader
{
public async Task<byte[]> LoadImageAsync(ImageSource source)
{
IImageSourceHandler handler = GetHandlerFor(source);
var bmp = await handler.LoadImageAsync(source, Forms.Context);
byte[] result;
using (Stream ms = new MemoryStream())
{
await bmp.CompressAsync(Android.Graphics.Bitmap.CompressFormat.Jpeg, 95, ms);
result = new byte[ms.Length];
ms.Position = 0;
await ms.ReadAsync(result, 0, (int)ms.Length);
}
return result;
}
private IImageSourceHandler GetHandlerFor(ImageSource source)
{
IImageSourceHandler result;
if (source is FileImageSource) result = new FileImageSourceHandler();
else if (source is StreamImageSource) result = new StreamImagesourceHandler();
else result = new ImageLoaderSourceHandler();
return result;
}
}
iOS
和Android一样,我们可以使用IImageSourceHandler转换成UIImage,然后从中获取字节
[assembly: Dependency(typeof(ImageLoader))]
public class ImageLoader : IImageLoader
{
public async Task<byte[]> LoadImageAsync(ImageSource source)
{
IImageSourceHandler handler = GetHandlerFor(source);
UIImage image = await handler.LoadImageAsync(source);
using (NSData imageData = image.AsPNG())
{
return imageData.ToArray();
}
}
private IImageSourceHandler GetHandlerFor(ImageSource source)
{
IImageSourceHandler result;
if (source is FileImageSource) result = new FileImageSourceHandler();
else if (source is StreamImageSource) result = new StreamImagesourceHandler();
else result = new ImageLoaderSourceHandler();
return result;
}
}
#Forms
请注意,我插入了[assembly: Dependecy(typeof(ImageLoader))],因此我们可以使用 Xamarin 表单从每个平台识别并带来正确的 ImageLoader,因此我们可以像这样使用它
byte[] bytes = await DependencyService.Get<IImageLoader>().LoadImageAsync(imgSource);
string base64String = Convert.ToBase64String(bytes) //convert the binary to a string representation in base64
#注意
IImageLoader是一个简单的界面,如下所示
public interface IImageLoader
{
Task<byte[]> LoadImageAsync(ImageSource source);
}