none
Картинку Binding из byte[] в Source RRS feed

  • Вопрос

  • Добрый день.

    У меня есть картинки в byte[] в поле varbinary[MAX] поле картинка записана в таком формате 0x3C8F490C0000000148454E45AE426182

    Загружаю я их туда через Drawing.Image

    Потом достаю из базы и пытаюсь показать картинку так

    1 вариант

    <Image Name="IMGPerson" Source="{Binding ImagePerson}"/>

    т.е. просто Binding к полю byte[] ImagePerson ничего не происходит, просто привязки нет и всё. Ошибок никаких

    2 вариант делаю так: Присваиваю Source вручную

    IMGPerson.Source = ImageInByte.ImageFromBuffer(_obsMyData[0].ImagePerson);
            public static BitmapImage ImageFromBuffer(Byte[] bytes)
            {
                MemoryStream stream = new MemoryStream(bytes);
                BitmapImage image = new BitmapImage();
                image.BeginInit();
                image.StreamSource = stream;
                image.EndInit();
                return image;
            }
    Ничего пишет ошибку

    Дополнительные сведения: Не удалось обнаружить компонент обработки изображений, который подходит для завершения данной операции.

    Та же ошибка в 3 варианте когда делаю привязку через Converter

    3 вариант

    <Image x:Name="IMGPerson" Source="{Binding ImagePerson, Converter={StaticResource DrawImageToMediaImage}, Mode=TwoWay}"

        [ValueConversion(typeof(System.Drawing.Image), typeof(System.Windows.Media.ImageSource))]
        public class DrawImageToMediaImage : IValueConverter
        {
            public object Convert(object value, Type targetType,
                object parameter, CultureInfo culture)
            {
                if (value == null) { return null; }
                var image = (System.Drawing.Image)value;
                var bitmap = new System.Windows.Media.Imaging.BitmapImage();
                bitmap.BeginInit();
                MemoryStream memoryStream = new MemoryStream();
                image.Save(memoryStream, ImageFormat.Bmp);       
                memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
                bitmap.StreamSource = memoryStream;
                bitmap.EndInit();
                return bitmap;
            }

    Чувствую что речь про разные Image Есть Drawing.Image есть Media.Image

    Загрузка самой картинки в <Image/>

                  System.Drawing.Image img = System.Drawing.Image.FromStream(fs);
    
                    MemoryStream ms = new MemoryStream();
                    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                    ms.Position = 0;
                    BitmapImage bi = new BitmapImage();
                    bi.BeginInit();
                    bi.StreamSource = ms;
                    bi.EndInit();
    
                    IMGPerson.Source = bi;

    Как правильно загрузить картинку?

    Спасибо


    • Изменено DevingAs 29 мая 2016 г. 10:22

Ответы

  • Вы видимо неверно записали изображение в базу, "формат" выглядит странно. В базе должны быть просто байте изображения.

    Делайте как то так:

    MemoryStream ms = new MemoryStream();

    fs.CopyTo(ms);

    var imageBlob = fs.ToArray();

    imageBlob и следует записывать в базу.

    Если требуется то можно преобразовать формат изображения, изменить размер и т.п. 

    После этого должен заработать первый вариант.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа DevingAs 30 мая 2016 г. 6:54
    Модератор