Невозможно создать поток из сохраненного изображения для преобразования байтов []

Я боролся с этой реализацией в течение нескольких часов и не могу найти какие-либо решения, куда бы я ни посмотрел (SO, форумы Xamarin, Google и т. Д.)...

В этом текущем сценарии у меня есть несколько изображений в .Droid.Resources.Drawable который я хочу получить доступ и преобразовать в byte[] из моего общего кода. Это связано с тем, что я хочу протестировать весь диапазон своих функций CRUD на REST API, который я настроил в качестве конечной точки для нашего сервера.

Изображения хорошо отображаются в приложении, но по какой-то причине я просто не могу исказить процесс преобразования этих изображений в byte[] в Хамарине. Я делал это бесчисленное количество раз в "нормальном" C#...

Извините, если код немного грязный, но я уверен, что вы поняли идею.

  1. Я хочу получить изображение от .Droid хранилище (будет перенесено для iOS позже)
  2. Преобразовать указанное изображение в byte[]
  3. Отправить это byte[] представление к моему API.

В текущем состоянии кода я получаю эту ошибку:

C#: экземпляр абстрактного класса не может быть создан

Где я пытаюсь создать новый поток (new Stream(sauce))


Приведенный ниже пример основан на фрагментах, найденных здесь, и вся заслуга Стена и Винсента.

   /*
    * 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 ответ

Попробуйте использовать 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();
        }
    }

Надеюсь это поможет!

Другие вопросы по тегам