检索、调整大小并将图像保存回 Access 数据库图像字段

Posted

技术标签:

【中文标题】检索、调整大小并将图像保存回 Access 数据库图像字段【英文标题】:Retrieve, Resize, and Save Images Back to Access Database Image Field 【发布时间】:2014-02-02 03:21:44 【问题描述】:

我有一张表,其中有一个照片列,其中一个用户决定开始将 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();

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

我这样做对吗?将数据存储为 blob 的方式与 SQL Server 数据库中的存储方式相同吗?此外,如果有人知道更简单的方法来做到这一点,那就太好了。谢谢

编辑

文本文件中的二进制数据。太大而不能放在这里是一个 Link

...还有截图:

【问题讨论】:

希望你能有所了解here 我用Access有一段时间了,你能用调试器看看pht的值吗? @spajce 谢谢,我会以此为起点。 @GavinH 是的,我最初没有发布它,因为它很大,但这里是行中的二进制文件。比较长 您确定构造MemoryStream时出现“参数无效”错误吗?如果没有看到实际错误,我会怀疑 ByteToImage 函数(我猜你写的)。 【参考方案1】:

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

对于您提供的文件,位图图像从第 79 个字节开始,BMP 标头为 424D。

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

【讨论】:

几个月前我也有一个相关的答案here。它包括一个 C# 类,用于从从 Access 数据库检索的字节中删除 OLE 标头信息。 好一个上帝! @bumble_bee_tuna 请注意,如果您调整图像大小并将其保存回数据库,您将仅保存图像字节而不是 OLE 对象。如果您不小心,最终会在数据库中混合使用原始图像和 OLE 图像。 @bumble_bee_tuna Gavin 提出了一个很好的观点。如果您想将图像另存为 OLE 对象,则最近有一个问题here 提供了一种解决方案。 @GordThompson Ole 标头是静态的还是可变的? @bumble_bee_tuna 根据我的经验,它已被证明是可变的。非常多变。

以上是关于检索、调整大小并将图像保存回 Access 数据库图像字段的主要内容,如果未能解决你的问题,请参考以下文章

将图像 (byte[] BMP) 保存到 Ole Photo 列

在 C# 中从 Access 数据库存储和检索图像

如何使用 GD 调整上传图像的大小并将其转换为 PNG?

php 魔术师调整大小 - 显示图像而不是保存到文件夹

使用 PHP GD 调整图像大小并保存图像。这段代码有啥问题?

Ionic2 Signature Pad 调整图像大小