检索,调整大小和保存图像返回Access数据库图像字段

时间:2014-02-02 03:21:44

标签: c# ms-access

我有一张表中有一个照片栏,其中一个用户决定开始将20MB图像保存到字段中,这导致数据库在不到一年的时间内大小增加了6倍。所以我的最终目标是遍历表格,拉动图像,调整大小并裁剪它,然后将其保存回数据库。

所以我最初的想法是这个数据被保存为blob字节数组,所以我正在尝试:

public static Bitmap ByteToImage(byte[] blob)
{
    using (var mStream = new MemoryStream())
    {
        mStream.Write(blob, 0, blob.Length);
        mStream.Seek(0, SeekOrigin.Begin);
        var bm = new Bitmap(mStream);
        return bm;
    }
}

//Method
const string myConnectionString = @"Driver={Microsoft Access Driver (*.mdb)};  Dbq=E:\SUFDB2006NoPics.mdb;Uid=Admin;Pwd=;";

using(var myConnection = new OdbcConnection())
{
    myConnection.ConnectionString = myConnectionString;
    myConnection.Open();
    var dadapter = new OdbcDataAdapter("Select [Contact ID#], [Photo] FROM Contact", myConnection);
    var table = new DataTable();
    dadapter.Fill(table);

    foreach (DataRow row in table.Rows)
    {
       var pht = (byte[])row["Photo"];

       //Tried this 1
       var stream = new MemoryStream(pht); //Parameter is not valid Error.
       pictureBox1.Image = Image.FromStream(stream);

       //Tried this 2
       pictureBox1.Image = ByteToImage(pht);

    }

    this.dataGridView1.DataSource = table; //However this works no problem
    dataGridView1.Refresh();
}

所以,有趣的是,image列绑定到datagridview没问题。但是,当我尝试将单个图像行绑定到图片框时,它会抛出错误。我会把二进制文件放好,但它的方法很长。图像没有损坏,因为它们在datagridview中没有问题。

我是以正确的方式来做这件事的吗?数据是否以与SQL Server数据库相同的方式存储为blob?此外,如果有人知道一个更容易的方法,这将是伟大的。感谢

修改

文本文件中的二进制数据。放在这里太大了 Link

...和截图:

OleWrapped.png

1 个答案:

答案 0 :(得分:3)

我查看了您发布的文件,看起来您将图像存储为OLE对象而不是图像的字节。 OLE容器会在文件前面添加一个标头,这就是为什么不能将字节数组直接解码为图像的原因。

对于您提供的文件,位图图像从字节79开始,带有BMP标题424D。

This answer有一些链接可以帮助你。