Как конвертировать varBinary в изображение или видео при получении из базы данных в C # - PullRequest
1 голос
/ 11 апреля 2011

Я использую Visual Studio 2010 (настольное приложение) и использую LINQ to SQL для сохранения изображений / видео или аудио файлов в базу данных в dataType VarBinary (MAX).Это я могу сделать ... Проблема в том, что я не могу получить их и отобразить в xaml, потому что не могу правильно преобразовать часть.Вот что у меня есть (хотя это не работает):

    private void bt_Click (object sender, RoutedEventArgs e)
    {
       databaseDataContext context = new databaseDataContext();

        var imageValue = from s in context.Images
                            where s.imageID == 2
                            select s.imageFile;

        value = imageValue.Single().ToString();        
        //convert to string and taking down to next method to get converted in image
    }

    public string value { get; set; }


    public object ImageSource //taking from http://stackoverflow.com/
    {
        get
        {
            BitmapImage image = new BitmapImage();
            try
            {
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                image.UriSource = new Uri(value, UriKind.Absolute);
                image.EndInit();

                Grid.Children.Add(image);
            }
            catch { return DependencyProperty.UnsetValue; } return image;
        }

    } 

Я даже не уверен, что нахожусь на правильном пути?И я предполагаю, что видео или аудио довольно похожи методы?

Ответы [ 4 ]

2 голосов
/ 11 апреля 2011

Поскольку ваше изображение хранится в двоичном формате в базе данных, вы хотите "преобразовать" его в объект изображения, используя объект MemoryStream.

Глядя на ваш код, ваше решение будет выглядеть примерно так:

BitmapImage bmpImage = new BitmapImage();
MemoryStream msImageStream = new MemoryStream();    

msImageStream.Write(value, 0, value.Length);

bmpCardImage.BeginInit();
bmpCardImage.StreamSource = new MemoryStream(msImageStream.ToArray());
bmpCardImage.EndInit();

image.Source = bmpCardImage;
1 голос
/ 11 апреля 2011

Это очень просто, если у вас есть двоичные данные и вы хотите создать объект Image, используйте этот код:

public Image BinaryToImage(byte[] binaryData)
{
     MemoryStream ms = new MemoryStream(binaryData);
     Image img = Image.FromStream(ms);
     return img;
}
0 голосов
/ 14 августа 2011

Код Дилли-О делает очень хороший метод расширения:

    // from /5095216/kak-konvertirovat-varbinary-v-izobrazhenie-ili-video-pri-poluchenii-iz-bazy-dannyh-v-c:
    public static BitmapImage ToImage(this Binary b)
    {
        if (b == null)
            return null;

        var binary = b.ToArray();
        var image = new BitmapImage();
        var ms = new MemoryStream();

        ms.Write(binary, 0, binary.Length);

        image.BeginInit();
        image.StreamSource = new MemoryStream(ms.ToArray());
        image.EndInit();

        return image;
    }
0 голосов
/ 11 апреля 2011

Если у вас уже есть байты, чтобы убедиться, что вы сохранили правильные данные, вы можете сохранить байты в файл и открыть его ....

string tempFile = Path.GetTempFileName();
MemoryStream ms = new MemoryStream(bytes); //bytes that was read from the db
//Here I assume that you're reading a png image, you can put any extension you like is a file name
FileStream stream = new FileStream(tempFile + ".png", FileMode.Create);
ms.WriteTo(stream);
ms.Close();
stream.Close();
//And here we open the file with the default program
Process.Start(tempFile + ".png");

А позже вы можете использовать ответ Дилли-О и стрим ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...