我一直在深入研究Xamarin.Forms.Labs,了解更多关于如何访问和操作图像的信息。将图像保存到Android/iOS图片库可以正常工作,从两者中检索图像也是如此,至少在用户交互中是这样的。
问题是我希望能够在内部保存一些文件到程序中。实际上,保存文件本身似乎并不是一个问题-我已经为此编写了一个接口/DependencyService解决方案。
我似乎不能做的是使用一个bytes[]映像或ImageSource访问图像数据本身的Xamarin.Forms或流。使用静态方法将流读入ImageSource相对简单,那么如何将这些字节取出以保存程序本身中的文件?
给出框架:我现在正在开发一个应用程序,用户在该应用程序中获取/选择要包含在表单中的图片,该表单最终会发布到一个网站上。因此,能够真正保存图片,或者访问数据本身以进行传输,是非常关键的。
发布于 2016-04-19 09:55:11
要做到这一点,一个非常麻烦的方法是为您的图像编写一个自定义呈现器。然后呈现程序将从本机控件中获取byte[]/Stream。下面是一个非常粗糙的实现,没有任何错误处理来帮助您入门:
public class MyImage : Image
{
public Func<byte[]> GetBytes { get; set; }
}下面是iOS渲染器:
public class MyImageRenderer : ImageRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
base.OnElementChanged(e);
var newImage = e.NewElement as MyImage;
if (newImage != null)
{
newImage.GetBytes = () =>
{
return this.Control.Image.AsPNG().ToArray();
};
}
var oldImage = e.OldElement as MyImage;
if (oldImage != null)
{
oldImage.GetBytes = null;
}
}
}Android one的内容稍微多了一点:
public class MyImageRenderer : ImageRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
base.OnElementChanged(e);
var newImage = e.NewElement as MyImage;
if (newImage != null)
{
newImage.GetBytes = () =>
{
var drawable = this.Control.Drawable;
var bitmap = Bitmap.CreateBitmap(drawable.IntrinsicWidth, drawable.IntrinsicHeight, Bitmap.Config.Argb8888);
drawable.Draw(new Canvas(bitmap));
using (var ms = new MemoryStream())
{
bitmap.Compress(Bitmap.CompressFormat.Png, 100, ms);
return ms.ToArray();
}
};
}
var oldImage = e.OldElement as MyImage;
if (oldImage != null)
{
oldImage.GetBytes = null;
}
}
}最后,这种用法是显而易见的:
var bytes = myImage.GetBytes?.Invoke();将这个想法扩展到支持流应该是非常简单的。显而易见的警告是,forms控件(MyImage)通过GetBytes()保留对其呈现器的引用,但这似乎是不可避免的。
https://stackoverflow.com/questions/25938386
复制相似问题