我有一张表中有一个照片栏,其中一个用户决定开始将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
...和截图:
答案 0 :(得分:3)
我查看了您发布的文件,看起来您将图像存储为OLE对象而不是图像的字节。 OLE容器会在文件前面添加一个标头,这就是为什么不能将字节数组直接解码为图像的原因。
对于您提供的文件,位图图像从字节79开始,带有BMP标题424D。
This answer有一些链接可以帮助你。