我面临着关于图像尺寸的奇怪问题。
我制作了一个简单的应用程序,用于在数据库中存储和检索图像。当我从文件中读取图像时,其大小以kB(千字节)为单位,字节数组的长度也是如此。
有两个图片盒。 pb1用于存储,pb2用于加载。
我的store()和load()方法如下:
注意:openConnState()和CloseConnState()是关闭和打开连接的方法。 byte [] img_byte和imgfilelength = 0在类中公开定义。
商品
private void StoreImage(string ChosenFile)
{
try
{
//MemoryStream ms = new MemoryStream();
//pb1.Image.Save(ms, ImageFormat.Jpeg);
//img_byte = new byte[ms.Length];
//ms.Position = 0;
//ms.Read(img_byte, 0, img_byte.Length);
FileInfo fileImage = new FileInfo(ChosenFile);
imgfilelength = fileImage.Length;
FileStream fs = new FileStream(ChosenFile, FileMode.Open, FileAccess.Read, FileShare.Read);
img_byte = new Byte[Convert.ToInt32(imgfilelength)];
int count, sum = 0;
while ((count = fs.Read(img_byte, 0, Convert.ToInt32(imgfilelength))) > 0)
{
sum += count;
}
//int byteread = fs.Read(img_byte, 0, Convert.ToInt32(imgfilelength));
fs.Close();
}
catch (Exception e)
{
throw e;
}
}
public void storetoDB()
{
OpenConnState(conn);
string str = "use db2 \n insert into TableImg(Image) \n values('" + img_byte + "')";
SqlCommand cmd = new SqlCommand(str, conn);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
throw e;
}
finally
{
CloseConnState(conn);
}
}
负载:
public void Loadimg()
{
try
{
pb2.Image = null;
byte[] getbyte = LoadImagefromDB(3);
using (MemoryStream ms = new MemoryStream(getbyte))
{
pb2.Image = Image.FromStream(ms);
}
pb2.Refresh();
}
catch (Exception e)
{
throw e;
}
}
public byte[] LoadImagefromDB(long pid)
{
byte[] img = null;
OpenConnState(conn);
string str = "use db2 \n select Image from TableImg where P_Id = " + pid;
SqlCommand cmd = new SqlCommand(str, conn);
try
{
img = (byte[])cmd.ExecuteScalar();
return img;
}
catch (System.Exception e)
{
throw e;
}
finally
{
CloseConnState(conn);
}
}
我使用上面给出的storeDB()方法将图像存储到数据库中,但是当我使用上面给出的load()方法检索图像时,出现错误,指出参数无效。我发现问题很可能与字节数组的长度有关,因为当我检索到'图像'将数据库的数据类型值转换为字节数组,字节数组的长度始终为13。
我甚至运行以下查询来获取其在数据库中的大小,它仍然是相同的,即13个字节。
从TableImg中选择len(转换(varbinary(max),Image)),其中P_Id = 1
谁能告诉我,为什么?
答案 0 :(得分:2)
我将数据库的'image'数据类型值检索到一个字节数组中, 字节数组的长度始终为13。
您正在尝试这样做:
use db2 \n insert into TableImg(Image) \n values('System.Byte[]')
显然,字符串System.Byte[]
的长度总是 13。
在插入之前,您必须将该二进制数据转换为其他类型。
根据this post,如果您的图片的字节数非常小,则可以将其存储为VARBINARY
类型。如果它很大,你应该将它存储在驱动器中。
修改强>
您可以这样使用:
using (SqlCommand cmd = new SqlCommand("use db2 \n insert into TableImg(Image) \n values(@binaryValue)", conn))
{
cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, img_byte.Length).Value = img_byte;
cmd.ExecuteNonQuery();
}