Существует ли кроссплатформенное решение ImageSource для byte[]?

Я провел исследования и остановился на этом решении: http://forums.xamarin.com/discussion/22682/is-there-a-way-to-turn-an-imagesource-into-a-byte-array

Исходный вопрос: http://forums.xamarin.com/discussion/29569/is-there-a-cross-platform-solution-to-imagesource-to-byte

Мы хотим загрузить изображение через HTTP-пост, вот что мы попробовали:

HttpClient httpClient = new HttpClient ();
byte[] TargetImageByte = **TargetImageSource**; //How to convert it to a byte[]?
HttpContent httpContent = new ByteArrayContent (TargetImageByte);
httpClient.PostAsync ("https://api.magikweb.ca/debug/file.php", httpContent);

Мы также испытываем трудности с библиотеками, которые мы должны включить в условия использования. Это похоже на using System.IO; работает, но это не дает нам доступ к таким классам, как FileInfo или же FileStream,

Кто-нибудь имеет какие-либо идеи, как это можно сделать, кроме пользовательских конвертеров для конкретной платформы? Возможно, функция Xamarin.Forms.ImageSource toByte()?

Дай мне знать, если тебе нужно больше информации.

TargetImageSource это Xamarin.Forms.ImageSource,

ImageSource TargetImageSource = null;

Решение (Стен был прав)

ImageSource должен существовать из другого типа, чтобы предыдущий тип мог быть преобразован в byte[], В этом случае я использую Xamarin.Forms.Labs, чтобы сделать снимок, и он возвращает MediaFile в котором FileStream доступен через Source имущество.

//--Upload image
//Initialization
HttpClient httpClient = new HttpClient ();
MultipartFormDataContent formContent = new MultipartFormDataContent ();
//Convert the Stream into byte[]
byte[] TargetImageByte = ReadFully(mediaFile.Source);
HttpContent httpContent = new ByteArrayContent (TargetImageByte);
formContent.Add (httpContent, "image", "image.jpg");
//Send it!
await httpClient.PostAsync ("https://api.magikweb.ca/xxx.php", formContent);

App.RootPage.NavigateTo (new ClaimHistoryPage());

Функция:

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

1 ответ

Решение

Я думаю, что вы смотрите на это немного задом наперед.

ImageSource способ предоставить исходное изображение для Xamarin.Forms.Image, чтобы показать некоторый контент. Если вы уже показываете что-то на экране, Image Представление было заполнено данными, полученными из других источников, такими как файл или ресурс, или хранящимися в массиве в памяти... или как бы то ни было, вы получили это в первую очередь. Вместо того, чтобы пытаться вернуть эти данные из ImageSource Вы можете сохранить ссылку на нее и загрузить ее по мере необходимости.

Может быть, вы можете немного рассказать о ваших конкретных потребностях, если не считаете, что это решение применимо к вашему делу.

Псевдокод:

ShowImage(){
  ImageSource imageSource = ImageSource.FromFile("image.png"); // read an image file
  xf_Image.Source = imageSource; // show it in your UI
}

UploadImage(){
  byte[] data =  File.ReadAll("image.png");
  // rather than 
  // byte[] data = SomeMagicalMethod(xf_Image.Source);
  HttpClient.Post(url, data);
}

ОБНОВИТЬ:

Поскольку вы делаете снимок, вы можете скопировать MediaFile.Source поток в поток памяти, затем вы можете сбросить позицию потока памяти, чтобы он указывал на начало потока, чтобы вы могли прочитать его еще раз и скопировать в тело http.

В качестве альтернативы вы можете хранить MediaFile.Source в файл и использовать ImageSource.FromFile загрузить его в пользовательском интерфейсе, а при необходимости - скопировать содержимое файла в текст сообщения http.

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