#c# #image #xaml #silverlight #windows-phone-7
#c# #изображение #xaml #silverlight #windows-phone-7
Вопрос:
У меня возникла проблема с преобразованием массива байтов в тип изображения для отображения в приложении на Windows Phone 7.
Данные извлекаются с сервера, и когда я загружаю данные, они работают нормально, но я испытываю трудности при преобразовании их обратно в формат изображения.
Кто-нибудь может пролить свет на эту проблему для меня?
Это мой метод преобразования массива байтов в растровое изображение,
public BitmapImage decodeImage(byte[] array)
{
MemoryStream ms = new MemoryStream(array, 0, array.Length);
// Convert byte[] to Image
ms.Write(array, 0, array.Length);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(ms);
return bitmapImage;
}
Тогда это код, в котором я пытаюсь установить возвращаемое растровое изображение в качестве источника для поля изображения, которое я использую в пользовательском интерфейсе XAML.
BitmapImage usrIMG = new BitmapImage();
usrIMG = getJson.decodeImage(userProfile.Photos[0].Image);
profileImage.Source = usrIMG;
Я знаю, что код выглядит беспорядочно, и я объявляю вещи, которые мне не нужны, я возился с этим целую вечность и я в полной растерянности.
Большое спасибо
Комментарии:
1. Какой формат изображения вы представляете в своем массиве байтов? Как вы сохранили его в первую очередь?
2. Я получаю его из инструмента PhotoChooser в WP7, затем помещаю его прямо в поток, я не уверен, но я думаю, что его формат — PhotoStream, поскольку это тип, который возвращается при выборе фотографии.
3. Вам не понадобится,
ms.Write
поскольку вы уже предоставили данные при построенииMemoryStream
.
Ответ №1:
следующий код отлично подходит для быстрого тестирования вашего сценария использования PhotoChooserTask и сохранения выбранного изображения в массиве байтов. Вы также можете просмотреть свой код, в котором вы храните, и извлечь массив байтов на своей стороне, чтобы убедиться, что там ничего не потеряно.
private byte[] imageBytes;
private void GetPhoto_Click(object sender, RoutedEventArgs e)
{
PhotoChooserTask photoTask = new PhotoChooserTask();
photoTask.Completed = new EventHandler<PhotoResult>(photoTask_Completed);
photoTask.Show();
}
void photoTask_Completed(object sender, PhotoResult e)
{
imageBytes = new byte[e.ChosenPhoto.Length];
e.ChosenPhoto.Read(imageBytes, 0, imageBytes.Length);
// save 'imageBytes' byte array to data base ...
}
private void ShowPhoto_Click(object sender, RoutedEventArgs e)
{
// load 'imageBytes' byte array to data base ...
BitmapImage bitmapImage = new BitmapImage();
MemoryStream ms = new MemoryStream(imageBytes);
bitmapImage.SetSource(ms);
myImageElement.Source = bitmapImage;
}
Ответ №2:
Для этого вам понадобится WritableBitmap
и знать высоту и ширину изображения.
Затем вы можете сделать что-то вроде этого:
var result = new WriteableBitmap(width, height);
var ms = new MemoryStream();
ms.Write(myByteArray, myByteArray, myByteArray.Length);
result.SetSource(ms);
Комментарии:
1. Я пробовал это, но это все еще не работает, я думаю, проблема в том, что полученный файл настраивается как отображаемое изображение
Ответ №3:
var BitmapImage = новый BitmapImage();
Растровое изображение.setSource(новый поток памяти (.. Данные двоичного массива ..));
изображение 1.Источник = растровое изображение;
Ответ №4:
public BitmapImage ByteArraytoBitmap(Byte[] byteArray)
{
MemoryStream stream = new MemoryStream(byteArray);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(stream);
return bitmapImage;
}
я использовал этот код раньше, и он работает на 100% успешно.