无法从数据库中检索字节数组图像并在图片框控件中显示

Posted

技术标签:

【中文标题】无法从数据库中检索字节数组图像并在图片框控件中显示【英文标题】:Trouble retrieving byte array image from database and display in picture box control 【发布时间】:2021-03-25 22:56:07 【问题描述】:

我在将字节数组的图像从数据库检索到 WPF 页面中的图片框时遇到一些问题。这是我从字节转换为图像的代码:

private BitmapImage GetBitmapImageFromBytes(byte[] bytes)

    BitmapImage btm;
    using(MemoryStream stream = new MemoryStream(bytes))
    
        btm = new BitmapImage();
        btm.BeginInit();
        btm.StreamSource = stream;
        btm.CacheOption = BitmapCacheOption.OnLoad;
        btm.EndInit();
        btm.Freeze();
    
    return btm;

我在从数据库读取数据的SQlDataReader 中调用此方法时遇到问题。这是下面的代码:

    private void StudentRegistrationForm_Loaded(object sender, RoutedEventArgs e)
            
        try
        
            StudentConn = new 
  SqlConnection(ConfigurationManager.ConnectionStrings["SchoolDB"].ConnectionString);
                StudentCmd = new SqlCommand();
                StudentCmd.Connection = StudentConn;
                StudentCmd.CommandType = CommandType.StoredProcedure;
                StudentCmd.CommandText = "spStudent_GetAll";

            StudentConn.Open();
            studentReader = StudentCmd.ExecuteReader();

                   if (studentReader.Read())
                   
                        TxtbID.DataContext = (int)studentReader["Id"];
                        TxtLastName.DataContext = (string)studentReader["LastName"];
                        TxtFirstName.DataContext = (string)studentReader["FirstName"];
                        TxtEmail.DataContext = (string)studentReader["Email"];
                        CboGender.SelectedItem = (string)studentReader["Gender"];
                        DtpDateOfBirth.DataContext = (DateTime)studentReader["DateofBirth"];
                        DtpDateRegistered.DataContext = (DateTime)studentReader["DateRegistered"];
                        TxtPhone.DataContext = (string)studentReader["MobileNumber"];
                        TxtComment.DataContext = (string)studentReader["Notes"];
                        CboReligion.SelectedItem = (string)studentReader["Religion"];
                        imgprofilePicture.DataContext = (Image)studentReader[GetBitmapImageFromBytes(ImageArray)];
                        CboSpecialAttention.SelectedItem = (string)studentReader["SpecialAttention"];
                        TxtGuardianID.DataContext = (int)studentReader["GuardianID"];

                   

        

        catch (Exception ex)
            
                if (ex is SqlException || ex is SystemException || ex is NullReferenceException)
                

                MessageBox.Show(ex.Message, "Error Establishing Connection to Student Data Service", MessageBoxButton.OK, MessageBoxImage.Error);
                
            
        finally
            
                StudentConn.Close();
                StudentConn.Dispose();
                studentReader.Close();
                StudentCmd.Dispose();               
            
        SetState("View");
       

我迷路了,我不知道我做错了什么,我只是得到了这么多不同类型的异常。请有人帮我检查代码并纠正我。

【问题讨论】:

设置所有这些控件的 DataContext 属性看起来很奇怪。您可以直接设置它们的 Text(或类似)属性,或者将它们的公共父元素的 DataContext 设置为您在从 db 读取数据时创建的数据对象,并将 UI 元素属性绑定到数据的属性对象。 【参考方案1】:

线

imgprofilePicture.DataContext =
    (Image)studentReader[GetBitmapImageFromBytes(ImageArray)];

没有意义。

XAML 中不应该有 PictureBox,而是 Image 元素,例如喜欢

<Image x:Name="image" .../>

然后,您可以将 Image 的 Source 属性设置为从您的方法返回的 BitmapImage:

image.Source = GetBitmapImageFromBytes((byte[])studentReader["ImageArray"]);

【讨论】:

我应用了您的代码 Clemens,它运行良好。

以上是关于无法从数据库中检索字节数组图像并在图片框控件中显示的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 从字节数组中显示 Web 表单中的图像

如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组

从手机图库中获取随机图片并在视图中显示

图像无法在表格视图中显示

C# - Emgu CV Retireve 并在 GUI(图片框或图像框)上显示计算的特征面和平均面

如何仅保存从我的图片框中显示的图像