Изображение в байт [], преобразовать и преобразовать обратно

У меня есть служба, которая преобразует изображения, хранящиеся на веб-сайте, в байтовый массив

                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("URLTOIMAGE");
                myRequest.Method = "GET";
                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                Bitmap bmp = new Bitmap(myResponse.GetResponseStream());
                myResponse.Close();
                ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);

Этот код возвращает массив байтов, который я храню в базе данных (SQL Azure). В своем приложении для Windows Phone я пытаюсь преобразовать этот массив байтов, чтобы отобразить его на моей странице.

public class BytesToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        BitmapImage empImage = new BitmapImage();
        empImage.SetSource(new MemoryStream((Byte[])value));
        return empImage;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                                System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

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

empImage.SetSource(new MemoryStream((Byte[])value));
=> "Exception was unhandled", The request is not supported

Можешь мне помочь? Спасибо


person Julien    schedule 21.03.2012    source источник
comment
какой тип изображения вы пытаетесь загрузить?   -  person BrokenGlass    schedule 21.03.2012
comment
Это JPEG = ›байт [] и байт [] для BitmapImage (для Imageource)   -  person Julien    schedule 21.03.2012


Ответы (3)


Этот код работает:

public class BytesToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        MemoryStream stream = new MemoryStream((Byte[])value);
        WriteableBitmap bmp = new WriteableBitmap(173, 173);
        bmp.LoadJpeg(stream);
        return bmp;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                                System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Всем спасибо :)

person Julien    schedule 21.03.2012
comment
вы также можете проверить решение здесь, в котором используется более динамичный подход к размеру изображения: stackoverflow.com/questions/9948252/ - person Michael; 30.03.2012

на эти вопросы уже были даны ответы в stackoverflow
для изображения в байт [] попробуйте это
и для байта [] для изображения попробуйте это

person harryovers    schedule 21.03.2012
comment
Я использую тот же код (использование memeorystream), но он не работает. - person Julien; 21.03.2012

Для своего приложения UWP я использую следующий IValueConverter для преобразования массива байтов в связываемый объект для <Image Source={Binding} />

internal class ByteImageSourceConverter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return null;
        return ByteToImage((byte[])value);
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }

    static ImageSource ByteToImage(byte[] imageBytes)
    {
        BitmapImage image = new BitmapImage();
        image.SetSource(imageBytes.ConvertToInMemoryRandomAcessStream());
        ImageSource src = image;
        return src;
    }
}

internal static InMemoryRandomAccessStream ConvertToInMemoryRandomAcessStream(this byte[] arr)
{
    var randomAccessStream = new InMemoryRandomAccessStream();
    randomAccessStream.WriteAsync(arr.AsBuffer());
    randomAccessStream.Seek(0);
    return randomAccessStream;
}

Извините за WriteAsync в синхронной функции. В рамках этого поста у меня нет времени решать эту проблему, но она работает следующим образом :)

person Jasper    schedule 20.03.2017