无法从存储的图像创建流以进行byte []转换

时间:2017-04-12 10:21:45

标签: c# android xamarin xamarin.forms xamarin.droid

我一直在努力实现这个实现几个小时,似乎无论在哪里都找不到任何解决方案(SO,Xamarin论坛,Google等)...

在这个当前场景中,我在.Droid.Resources.Drawable中有一些图像,我希望从我的共享代码中访问并转换为byte[]。这是因为我希望在我设置为服务器端点的REST API上测试 CRUD 功能的完整范围。

图片在应用程序中显示得很好,但出于某些原因,我似乎无法在将这些图像转换为Xamarin中的byte[]的过程中扭曲。我在“正常” C# ...

中做了无数次

很抱歉,如果代码有点乱,但我相信你明白了。

  1. 我想从.Droid存储中获取图像(稍后将移植到iOS)
  2. 将所述图片转换为byte[]
  3. byte[]表示发送到我的API。
  4. 在代码的当前状态中,我收到此错误:

      

    C#:无法创建抽象类的实例

    我正在尝试创建新流(new Stream(sauce)

    以下示例基于找到here的摘要,并且完全归功于Sten和Vincent。

       /*
        * Takes an arbitrary string as a token, updates a record with dummy data and a placeholder_image.
        */
        public async Task<string> PostUpdateFoundation(string arbitrary, Image img)
        {
    
            ImageSource sauce = ImageSource.FromFile("abc.png");
            byte[] byte_img = FromStreamToByte(new Stream(sauce)); //error occurs here
            Debug.WriteLine("I'm in!");
            var client = new System.Net.Http.HttpClient();
            client.DefaultRequestHeaders.Add("Accept", "application/json");
    
            var content = new StringContent(arbitrary);
            var response = await client.PostAsync(String.Format("http://some.api.to.test.com?s={0}&img={1}", arbitrary, byte_img), content); 
            var result = response.Content.ReadAsStringAsync().Result; 
            return result;
    
        }
       /*
        * Attempts to convert an stream (based on image source) into a byte[].
        */
        public static byte[] FromStreamToByte (Stream input)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                input.CopyTo(ms);
                return ms.ToArray();
            }
        }
    

1 个答案:

答案 0 :(得分:0)

尝试使用Plugin.Media

            byte BImageSource = ReadFully(file.GetStream());
            var bytes = new byte[file.GetStream().Length]; //file is from the plugin and contains your image
            file.GetStream().Position = 0;
            file.GetStream().Read(bytes, 0, (int)file.GetStream().Length);
            BImageSource = ReadFully(file.GetStream()); //BImageSource is your resource in bytes

    byte[] ReadFully(Stream input)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            input.CopyTo(ms);
            return ms.ToArray();
        }
    }

希望这有帮助!