c# - 使用 wpf C# Ado.Net 数据实体从 SQL Server 获取图像到数据网格中

标签 c# sql-server wpf linq datagrid

我有这张表,想从中获取数据。它包含一个我保存为 varbinary 数据类型的图像文件。我想在数据网格中显示图像作为描述。

enter image description here

我有以下代码用于从字节到 varbinary(图像)以及从图像到字节的转换。

public byte[] ConvertToBytes(BitmapImage bitmapImage)
{
    using (var stream = new MemoryStream())
    {
        var encoder = new PngBitmapEncoder(); // or some other encoder
        encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
        encoder.Save(stream);
        return stream.ToArray();
    }
}

public ImageSource BytesToImage(byte[] imageData)
{
    using (var ms = new MemoryStream(imageData))
    {
        var image = new BitmapImage();
        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.StreamSource = ms;
        image.EndInit();

        ImageSource imgSrc = image as ImageSource;

        return imgSrc;
    }
}

从图像到 byte[] 的转换有效。但是我不确定从字节到图像的转换代码是否有效。

我在从数据库调用数据的 linq 查询中也有编译错误:

public List<RoomViewModel> getRooms()
{
    List<RoomViewModel> getRoomsQuery;

    using (db = new MyHotelDBContext())
    {
        getRoomsQuery = (from r in db.Rooms
                         join t in db.RoomTypes on r.RoomTypeID equals t.ID
                         join f in db.Floors on r.FloorID equals f.ID
                         select new RoomViewModel
                         {
                             ID = r.ID,
                             Nr = r.Nr,
                             rType = t.Name,
                             Image = BytesToImage(r.Image as BitmapImage),
                             Description = r.Description,
                             rFloor = f.Floor1
                         }).ToList();
    }
    return getRoomsQuery ?? new List<RoomViewModel>(); 
}

这一行的问题在哪里:

Image = BytesToImage(r.Image as BitmapImage)

如何修复/改进此代码?

最佳答案

这里似乎已经解决了这个问题:

Display image from database in asp mvc

但是,我会添加一种我认为对小图像有用的方法。您可以简单地将字节写入源本身中的 base64string,而不是单独的 Controller 来生成图像文件数据。

您会将图像字节输出到模型:

                             select new RoomViewModel
                             {
                                 ID = r.ID,
                                 Nr = r.Nr,
                                 rType = t.Name,
                                 ImageBytes = r.Image as Byte[],
                                 ImageType = "image/jpg", // for example
                                 Description = r.Description,
                                 rFloor = f.Floor1
                             }).ToList();

然后在网格中以适当的转换呈现 src 字符串。像这样的东西:

<img src="data:@Model.ImageType;base64,@Convert.ToBase64String(Model.ImageBytes)" />

关于c# - 使用 wpf C# Ado.Net 数据实体从 SQL Server 获取图像到数据网格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33724156/

相关文章:

ItemsControl 内按钮的 WPF 命令参数

c# - 为什么在某些浏览器中我的 Session 对象得到了错误的值?

c# - 如何检查空的 Gridview

c# - 我无法在 Visual Studio 2015 中创建任何 Web 项目

c# - 如何限制长时间运行的命令行 EXE 以避免占用 CPU?

wpf - Windows 关闭时 Window OnClosing

VS 上的 sql INNER JOIN 表变量。内部连接(选择)开启

sql-server - sql server认为空字符串等于一些字符

sql-server - Azure BACPAC 备份文件与 SQL Server BAK 文件有何不同?

wpf - WPF 应用程序的 19 个线程