Подтвердить что ты не робот

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

Я исследовал и упал на это решение: 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#latest

Мы хотим загрузить изображение через 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()?

Lemme знает, нужна ли вам дополнительная информация.

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();
    }
}
4b9b3361

Ответ 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);
}

UPDATE:

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

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