Преобразование байта [] в тип изображения в C # для Windows Phone 7

#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% успешно.