Существует ли кроссплатформенное решение 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.