我已将屏幕截图图像保存到数据库并将其转换为二进制代码。但是,一旦我想要检索它,只显示文件名,但图像没有。
我该如何解决这个问题?
以下是我用来将图像保存到数据库的代码(当用户点击图片框时,它会捕获图像(截图)):
public string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/Example/Database/db1.accdb;";
public static void AddScreenshot()
{
_workingRectangle = Screen.PrimaryScreen.Bounds;
string _dateTime = DateTime.Now.ToString("dd - MM - yyyy - hh - mm - ss tt");
string _path = "D:/Example/Screenshots/Screenshot " + _dateTime + ".jpg";
string _fileName = "Screenshot " + _dateTime + ".jpg";
try
{
using (Bitmap bitmap = new Bitmap(_workingRectangle.Width, _workingRectangle.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(new Point(_workingRectangle.Left, _workingRectangle.Top), Point.Empty, _workingRectangle.Size);
}
bitmap.Save(_path, ImageFormat.Jpeg);
}
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
string query = "INSERT INTO [Capture] ([Path], [FileName], [Data]) VALUES (@Path, @FileName, @Data)";
conn.Open();
FileStream fsBLOBFile = new FileStream(_path, FileMode.Open, FileAccess.Read);
Byte[] bytBLOBData = new Byte[fsBLOBFile.Length];
fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length);
fsBLOBFile.Close();
using (OleDbCommand command = new OleDbCommand(query, conn))
{
command.Parameters.Add("@Path", OleDbType.VarChar);
command.Parameters["@Path"].Value = _path;
command.Parameters.Add("@FileName", OleDbType.VarChar);
command.Parameters["@FileName"].Value = _fileName;
OleDbParameter prm = new OleDbParameter("@Data", OleDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytBLOBData);
command.Parameters.Add(prm);
command.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception ex)
{
}
}
这就是我检索它的方式:
private void RetrieveScreenshot()
{
DataTable _dt = new DataTable();
try
{
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
string query = "SELECT [Path], [FileName], [Data] FROM [Capture]";
conn.Open();
using (OleDbCommand command = new OleDbCommand(query, conn))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn))
{
adapter.Fill(_dt);
GridView1.DataSource = _dt;
GridView1.DataBind();
adapter.Dispose();
command.Dispose();
}
conn.Close();
}
}
catch(Exception ex)
{
}
}
结果是这样的:
这是图像,存储在文件夹中:
你的回答非常感谢我!
非常感谢你。
答案 0 :(得分:0)
您需要先将BLOB
转换为字节数组,然后将该字节数组转换为图像。
这是将BLOB
转换为字节数组的方法,
byte[] byteArrayIn = (byte[])_dt.row[0]["data"];
这是您可以用来将字节数组转换为图像的方法
private Image byteArrayToImage(byte[] byteArrayIn)
{
return Image.FromStream(new MemoryStream(byteArrayIn));
}
所有这一切都必须在将数据源设置为gridview首先转换然后设置之前完成。或者,您可以使用OnRowDataBound event将每个字节数组转换为图像,然后设置为网格行。