首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取图像的bytes[] /流或Xamarin.Forms中的ImageSource?

获取图像的bytes[] /流或Xamarin.Forms中的ImageSource?
EN

Stack Overflow用户
提问于 2014-09-19 16:23:48
回答 1查看 7.9K关注 0票数 7

我一直在深入研究Xamarin.Forms.Labs,了解更多关于如何访问和操作图像的信息。将图像保存到Android/iOS图片库可以正常工作,从两者中检索图像也是如此,至少在用户交互中是这样的。

问题是我希望能够在内部保存一些文件到程序中。实际上,保存文件本身似乎并不是一个问题-我已经为此编写了一个接口/DependencyService解决方案。

我似乎不能做的是使用一个bytes[]映像或ImageSource访问图像数据本身的Xamarin.Forms或流。使用静态方法将流读入ImageSource相对简单,那么如何将这些字节取出以保存程序本身中的文件?

给出框架:我现在正在开发一个应用程序,用户在该应用程序中获取/选择要包含在表单中的图片,该表单最终会发布到一个网站上。因此,能够真正保存图片,或者访问数据本身以进行传输,是非常关键的。

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 09:55:11

要做到这一点,一个非常麻烦的方法是为您的图像编写一个自定义呈现器。然后呈现程序将从本机控件中获取byte[]/Stream。下面是一个非常粗糙的实现,没有任何错误处理来帮助您入门:

代码语言:javascript
复制
public class MyImage : Image
{
    public Func<byte[]> GetBytes { get; set; }
}

下面是iOS渲染器:

代码语言:javascript
复制
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的内容稍微多了一点:

代码语言:javascript
复制
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;
        }
    }
}

最后,这种用法是显而易见的:

代码语言:javascript
复制
var bytes = myImage.GetBytes?.Invoke();

将这个想法扩展到支持流应该是非常简单的。显而易见的警告是,forms控件(MyImage)通过GetBytes()保留对其呈现器的引用,但这似乎是不可避免的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25938386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档