1

我在 Visual Studio 2010 中有一个 C# 程序,我正在访问我的访问数据库中的数据。我可以得到所有的信息,除了图像。我已按照此处的步骤将图片嵌入到 access 数据库中。

Right-click the first field in the Image column of the table and click Insert Object.
Click Create from File, and then click Browse.
Browse to one or more Windows Bitmap (.bmp) or Device Independent Bitmap (.dib) images.      
You can find a set of BMP files, named Empid1.bmp through Empid9.bmp, at 
drive:\Program Files\Microsoft Office\OFFICE11\SAMPLES. Select the first image and click OK.

不过,我使用了位图图像的位置。我有一个包含位图属性的构造函数,但是当它尝试转到表以获取所有信息时,我收到错误消息:“无法将 System.Byte [] 的对象转换为 System.Drawing.Bitmap 类型。” 不知道为什么说图像存储为系统字节。

找到这个线程。所以我尝试了内存流,但同样的问题,无法将系统字节转换为 system.io.memorystream。

4

2 回答 2

0

内存流可以从字节数组中创建,图像可以从内存流中创建。以下代码将编译:

byte[] bytes = new byte[0];  
MemoryStream ms = new MemoryStream(bytes);  
Image img = Image.FromStream(ms);
于 2013-11-15T02:39:24.280 回答
0

您在问题中描述的将位图图像插入 Access 数据库的过程将保存嵌入在 OLE 对象中的图像。如果您只想在 C# 程序中使用图图像,则需要从从 Access 检索的二进制数据中删除 OLE“包装器”。

例如,如果我从 Access 数据库中检索它并尝试将其直接转换为新Bitmap对象...

private void Form1_Load(object sender, EventArgs e)
{
    using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb;"))
    {
        con.Open();
        using (var cmd = new OleDbCommand("SELECT LastName, FirstName, Photo FROM Clients WHERE ID=3", con))
        {
            OleDbDataReader rdr = cmd.ExecuteReader();
            rdr.Read();
            this.textBox1.Text = rdr["FirstName"].ToString();
            this.textBox2.Text = rdr["LastName"].ToString();
            byte[] photoBytes = (byte[])rdr["Photo"];
            var ms = new System.IO.MemoryStream(photoBytes);
            this.pictureBox1.Image = new System.Drawing.Bitmap(ms);
            ms.Close();
        }
        con.Close();
    }
}

...我收到“参数无效”错误:

参数.png

但是,如果我在此处的其他答案中使用类的GetImageBytesFromOLEField方法删除 OLE“包装器” ...OleImageUnwrap

var ms = new System.IO.MemoryStream(OleImageUnwrap.GetImageBytesFromOLEField(photoBytes));

...然后它的工作原理:

汉克.png

于 2013-11-15T10:46:36.637 回答