【问题标题】:No imaging component suitable to complete this operation was found.wpf c# [duplicate]找不到适合完成此操作的成像组件.wpf c# [重复]
【发布时间】:2018-02-24 22:05:09
【问题描述】:

我正在尝试从 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);
    }
}

上面的代码返回错误:

找不到适合完成此操作的成像组件。

我花了几个小时试图弄清楚如何解决它。任何帮助将不胜感激。

更新 在 cmets 中,有人问我是否正确插入了数据。好吧,这是我用来插入数据的代码:

public void adddata()
{
con.Open();
OleDbCommand cmd = new OleDbCommand("Insert into   recents(Pic)values(@pic)", con);
byte[] data;
System.Drawing.Image myimage =  System.Drawing.Image.FromFile("E:\\19686468_1419770068104721_1127495277_o.png");
using (MemoryStream ms = new MemoryStream())
{
    myimage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
    data = ms.ToArray();
}

cmd.Parameters.AddWithValue("@pic", data);
cmd.ExecuteNonQuery();
con.Close();
}

请帮帮我!

【问题讨论】:

  • 哪一行给出了错误?假设它是最后一行,我的猜测是你消费了两次流(第一次在上一行)而没有回到起点。我不记得了,但我认为在使用 Image.FromStream 时可能无法实现。您可能必须先制作另一个数据副本。
  • image.fromstream 引发错误....任何帮助?
  • 你用谷歌搜索过这条消息吗?当我尝试它时,我得到了一些点击。在您的问题中添加一些详细信息,以表明您尝试过的内容以及获得的结果。以及您在 Google 上搜索的内容,以及这些解决方案使您失败的原因。
  • 我尝试将内存流转换为可写位图,但没有成功.....
  • 和@GreatBigBore,我用谷歌搜索并尝试了msdn、codeproject.SO甚至asp.net论坛中给出的每一个解决方案,但没有运气..问题是,没有人面对我的风景(之前从 db 检索图像时出错,因为谷歌结果显示其他场景

标签: c# wpf image memorystream


【解决方案1】:

已修复...对于将来遇到此错误的任何人:

  1. 确保以正确的方式插入数据(有时数据库中损坏的数据会导致此类错误)

2 。您无需进行繁重的编码即可将图像转换为字节!

最后,让我们编码吧:

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);
        }
    }
}

【讨论】:

  • 不要在 WPF 应用程序中使用 System.Drawing.Image。这段代码太可怕了。您可以直接解码来自 strm 的 WPF BitmapImage 或 BitmapFrame,例如 bi.StreamSource = strm
  • bi.StreamSource = strm 返回“无成像组件”错误
  • 如果字节数组包含 WPF 可以解码的有效位图帧,例如BMP、PNG、JPEG 等。如果您存储有效位图,您还可以从数据库中检索有效位图。整个 System.Drawing.Image 的东西在这里都是废话。
  • @Clemens,我意识到你所说的......所以,如果图片有效,我的问题中的代码会起作用吗?
  • 我就是这么说的。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2011-07-27
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多