Невозможно создать поток из сохраненного изображения для преобразования байтов []
Я боролся с этой реализацией в течение нескольких часов и не могу найти какие-либо решения, куда бы я ни посмотрел (SO, форумы Xamarin, Google и т. Д.)...
В этом текущем сценарии у меня есть несколько изображений в .Droid.Resources.Drawable
который я хочу получить доступ и преобразовать в byte[]
из моего общего кода. Это связано с тем, что я хочу протестировать весь диапазон своих функций CRUD на REST API, который я настроил в качестве конечной точки для нашего сервера.
Изображения хорошо отображаются в приложении, но по какой-то причине я просто не могу исказить процесс преобразования этих изображений в byte[]
в Хамарине. Я делал это бесчисленное количество раз в "нормальном" C#...
Извините, если код немного грязный, но я уверен, что вы поняли идею.
- Я хочу получить изображение от
.Droid
хранилище (будет перенесено для iOS позже) - Преобразовать указанное изображение в
byte[]
- Отправить это
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();
}
}
Надеюсь это поможет!