未找到适合完成此操作的成像组件。wpf c#

未找到适合完成此操作的成像组件。wpf c#,c#,wpf,image,memorystream,C#,Wpf,Image,Memorystream,我正在尝试从WPF中的.mdb数据库加载图像。我正在使用以下代码: public void loadimg() { con.Open(); OleDbCommand cmd = new OleDbCommand("Select * from recents", con); DataTable table = new DataTable; OleDbDataAdapter adap = new OleDbDataAdapter(cmd); adap.Fill

我正在尝试从WPF中的.mdb数据库加载图像。我正在使用以下代码:

public void loadimg()
{
    con.Open();
    OleDbCommand cmd = new OleDbCommand("Select * from recents", con);
    DataTable table = new DataTable;
    OleDbDataAdapter adap = new OleDbDataAdapter(cmd);
    adap.Fill(table);
    if (table.Rows.Count <= 0)
    {
        MsgBox("nooo");
    }
    else
    {
        MemoryStream stream = new MemoryStream();
        StreamWriter stm;
        BinaryWriter writer = new BinaryWriter(stream);
        int bufferSize = 100;
        byte[] outByte = new byte[bufferSize + 1];
        long retval;
        long startIndex = 0;
        string pubID = "";
        OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
        reader.Read();
        while (reader.Read())
        {
            startIndex = 0;
            retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
            while (retval == bufferSize)
            {
                writer.Write(outByte);
                writer.Flush();
                startIndex += bufferSize;
                retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
            }

            writer.Write(outByte, 0, (int)retval - 1);
            writer.Flush();
        }

        reader.Close();
        con.Close();
        stream.Position = 0;
        stream.Seek(0, SeekOrigin.Begin);
        System.Drawing.Image _Image = System.Drawing.Image.FromStream(stream);
        image1.Source = System.Windows.Media.Imaging.BitmapFrame.Create(stream);
    }
}

请帮帮我

修复了它…对于将来面临此错误的任何人:

  • 确保以正确的方式插入数据(有时数据库中损坏的数据会导致此类错误)
  • 二,。你不需要做一些繁重的编码来将图像转换成字节

    最后,让我们编写代码:

    public void loadimg()
    {
        con.Open();
        OleDbCommand cmd = new OleDbCommand("Select * from recents", con);
        OleDbDataReader _dr;
        _dr = cmd.ExecuteReader;
        byte[] _photo;
        while (_dr.Read())
        {
            try
            {
                _photo = (byte[])_dr(1);
                BitmapImage bi = new BitmapImage();
                using (MemoryStream strm = new MemoryStream(_photo))
                {
                    bi.BeginInit();
                    bi.CacheOption = BitmapCacheOption.OnLoad;
                    bi.StreamSource = strm;
                    bi.EndInit();
                }
                image1.Source = bi;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
    

    哪一行给出了错误?假设这是最后一行,我猜您将两次使用流(前一行的第一次),而不返回开始。我不记得了,但我认为在使用Image.FromStream时可能不可能。您可能需要先复制另一份数据。
    image.fromstream
    t显示错误……有什么帮助吗?您在谷歌上搜索过该消息吗?当我尝试它时,我得到了一些点击。在你的问题中添加一些细节,说明你尝试了什么,得到了什么结果。我试图将memorystream转换成一个可写位图,但没有运气,@GreatBigBore,我在谷歌上搜索了它,并尝试了msdn、codeproject.SO甚至asp.net论坛中给出的每一个解决方案,但没有运气。问题是,没有人面对我的风景(从db检索图像时出错),因为google结果显示其他场景在WPF应用程序中不使用System.Drawing.image。此代码非常糟糕。您可以直接从
    strm
    解码WPF位图图像或位图帧,如
    bi.StreamSource=strm
    bi.StreamSource=strm
    返回“无图像组件”errorNot如果字节数组包含WPF可以解码的有效位图帧,例如BMP、PNG、JPEG等。如果存储有效位图,也可以从数据库中检索有效位图。整个System.Drawing.Image内容在这里都是胡说八道。@Clemens,我意识到你说的……那么,如果图片有效,我问题中的代码是否会你工作过吗?我就是这么说的。
    public void loadimg()
    {
        con.Open();
        OleDbCommand cmd = new OleDbCommand("Select * from recents", con);
        OleDbDataReader _dr;
        _dr = cmd.ExecuteReader;
        byte[] _photo;
        while (_dr.Read())
        {
            try
            {
                _photo = (byte[])_dr(1);
                BitmapImage bi = new BitmapImage();
                using (MemoryStream strm = new MemoryStream(_photo))
                {
                    bi.BeginInit();
                    bi.CacheOption = BitmapCacheOption.OnLoad;
                    bi.StreamSource = strm;
                    bi.EndInit();
                }
                image1.Source = bi;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }