我想从数据库中读取我在二进制字段中存储图像并显示图像。
while (reader.Read())
{
byte[] imgarr = (byte[])reader["file"];
Stream s = new MemoryStream(imgarr);
System.Drawing.Image image = System.Drawing.Image.FromStream(s);
Graphics g = Graphics.FromImage(image);
g.DrawImage(image, new Point(400, 10));
image.Save(Response.OutputStream, ImageFormat.Jpeg);
g.Dispose();
image.Dispose();
}
con.Close();
这段代码不起作用:
System.Drawing.Image image = System.Drawing.Image.FromStream(s);
我尝试了this article.中的代码 我得到了同样的错误“参数无效”。 也许我不知道某些东西,sql server或webconfig中的某些设置或者其他。有从数据库中获取图像的经验的其他人吗?
参数无效是 错误信息。 db表包含数据。 我究竟做错了什么?
答案 0 :(得分:3)
public Byte[] Ret_image(Int32 id)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select*from tbimage where imageid=@id";
cmd.Connection = con;
cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
Byte[] ar = (Byte[])(dr[1]);
dr.Close();
cmd.Dispose();
return ar;
}
protected void btnRetImage_Click(object sender, EventArgs e)
{
try
{
Byte[] ar = Ret_image(Convert.ToInt32(TextBox2.Text));
String st = Server.MapPath("abc.jpg");
FileStream fs = new FileStream(st, FileMode.Create, FileAccess.Write);
fs.Write(ar, 0, ar.Length);
fs.Close();
Image1.Visible = true;
Image1.ImageUrl = "abc.jpg";
Label1.Visible = false;
}
catch(Expration exp)
{
Label1.Text = "Wrong Image id";
Label1.Visible = true;
Image1.Visible = false;
}
}
}
答案 1 :(得分:0)
你说的行不起作用对我来说是正确的。由于你没有说出什么样的图像,也许它是一种不受支持的格式。
否则,我会猜测实际问题是在
byte[] imgarr = (byte[])reader["file"];
并且字节数组不包含您认为应该的数据。
答案 2 :(得分:0)
通常将Stream位置设置为0可以解决问题:
Stream s = new MemoryStream(imgarr);
s.Position = 0;
答案 3 :(得分:0)
您可能想要查看dbfile StaticSql.cs文件中包含您要查找的内容。
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
... other code
byte[] filebytes = (byte[])rdr[FILE_STREAM];
result.FileBytes = new byte[filebytes.Length];
Array.Copy(filebytes, result.FileBytes, filebytes.Length);
}
DBFile.cs有文件编写代码
response.ContentType = file.ContentType;
byte[] buffer = new byte[file.ByteCount];
file.Read(buffer, 0, file.ByteCount);
response.BinaryWrite(buffer);
只要您在响应中设置内容类型并且您在响应中编写文件,就不需要创建图像然后保存它(除非您正在对其进行一些编辑)。