如何从IP摄像机流式传输后将图像保存到数据库?

时间:2011-03-28 12:01:08

标签: c# sql image streaming

我有一个代码来从IP摄像头流式传输快照并将其保存在硬盘上。  然后我有另一个代码来读取它并将其存储在ms-sql数据库中。 我知道如果我只是流式传输图像并将其保存在数据库中而不将其保存在硬盘上并再次读取它会更快。但我不知道如何合并这个。

获取图片的代码

        string sourceURL = "http://" + ip + "/cgi-bin/cmd/encoder?SNAPSHOT";
        WebRequest req = (WebRequest)WebRequest.Create(sourceURL);
        req.Credentials = new NetworkCredential("admin", "123456");
        WebResponse resp = req.GetResponse();
        Stream stream = resp.GetResponseStream();
        Bitmap bmp = (Bitmap)Bitmap.FromStream(stream);
        bmp.Save(ImagePath);

然后将图像插入数据库:

byte[] imageData = ReadFile(ImageName);
using (SqlConnection cn = new SqlConnection(constr))
  {
  string qry = "update vaiolations set val_image=@ImageData ,valid=1 where id=@OriginalPath ";
  SqlCommand SqlCom = new SqlCommand(qry, cn);
  SqlCom.Parameters.Add(new SqlParameter("@OriginalPath", (object)id));
  SqlCom.Parameters.Add(new SqlParameter("@ImageData", (object)imageData));
  cn.Open();
  SqlCom.ExecuteNonQuery();
  cn.Close();
  cn.Dispose();
  }
  byte[] ReadFile(string sPath)
   {
     using (FileStream fStream = new FileStream(sPath, FileMode.Open,      FileAccess.Read))
     {
      byte[] data = null;
      FileInfo fInfo = new FileInfo(sPath);
      long numBytes = fInfo.Length;
      BinaryReader br = new BinaryReader(fStream);
      data = br.ReadBytes((int)numBytes);
      return data;
     }
   }

如何组合这两个代码段来流式传输图像,然后立即将其插入数据库?

1 个答案:

答案 0 :(得分:1)

为什么要将传入的字节转换为位图?

您可能只是将流读取到内存流,并将其传递给数据库:

Stream stream = resp.GetResponseStream();
byte[] data;
using (MemoryStream ms = new MemoryStream())
{
  int num_bytes = 0;
  byte[] temp = new byte[4096];
  while ((num_bytes = stream.Read(temp, 0, temp.Length)) > 0)
    ms.Write(temp, 0, bytes);
  data = ms.ToArray();
}

然后将数据传递到您的数据库。