Win Form 接收摄像头信号,截图直接存入数据库,本地不留档. 问题是这样的:用C#做一个WIN FORM,接收摄像头的信号,然后再截图,再把图片传入数据库.前边部分接收依信号做好了,问题就是传入数据库.要求是不在本地保存图片的,就是一按截图按钮,直接以二进制数据保存入库.当然还得存进图片信息.麻烦教教我... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你截的图,直接放到一个内存文件中——图对象,然后再通过socket传过去或直接写到数据库,没有难的吧? 不懂...我现在的代码水平只能做到这样: private void button3_Click(object sender, EventArgs e) { try { Form1.SendMessage(this.hHwnd, 0x41e, 0, 0); IDataObject obj1 = Clipboard.GetDataObject(); if (obj1.GetDataPresent(typeof(Bitmap))) { Image image1 = (Image)obj1.GetData(typeof(Bitmap)); SaveFileDialog SaveFileDialog1 = new SaveFileDialog(); SaveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmmss"); SaveFileDialog1.Filter = "Image Files(*.JPG;*.GIF)|*.JPG;*.GIF|All files (*.*)|*.*"; if (SaveFileDialog1.ShowDialog() == DialogResult.OK) { image1.Save(SaveFileDialog1.FileName, ImageFormat.Bmp); } } } catch { } } private void button3_Click(object sender, EventArgs e)//GetCapture { SqlConnection Con = new SqlConnection("Data Source=Localhost; Initial Catalog=EX_NEW; User ID=sa;Pwd=photosystem;"); string SqlCmd = "INSERT INTO ImageStore (ImageData, ImageContentType, ImageDescription, ImageSize) VALUES (@Image, @ContentType, @ImageDescription, @ImageSize)"; SqlCommand CmdObj = new SqlCommand(SqlCmd, Con); CmdObj.Parameters.Add("@Image", SqlDbType.Image).Value = textBox1.Text; CmdObj.Parameters.Add("@ImageDescription", SqlDbType.NVarChar).Value = Convert.ToByte(textBox1.Text); //CmdObj.Parameters.Add("@Image", SqlDbType.Binary, FileLength).Value = FileByteArray; //CmdObj.Parameters.Add("@ContentType", SqlDbType.VarChar, 50).Value = fs.ContentType; //记录文件类型 //把其它单表数据记录上传 CmdObj.Parameters.Add("@ImageDescription", SqlDbType.VarChar, 200).Value = textBox1.Text; //记录文件长度,读取时使用 //CmdObj.Parameters.Add("@ImageSize", SqlDbType.BigInt, 8).Value = UpFile.ContentLength; Con.Open(); if (CmdObj.ExecuteNonQuery() == 1) { MessageBox.Show("Successfully "); } else { MessageBox.Show("Failed "); } Con.Close(); try { Form1.SendMessage(this.hHwnd, 0x41e, 0, 0); IDataObject obj1 = Clipboard.GetDataObject(); if (obj1.GetDataPresent(typeof(Bitmap))) { Image image1 = (Image)obj1.GetData(typeof(Bitmap)); SaveFileDialog SaveFileDialog1 = new SaveFileDialog(); SaveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmmss"); SaveFileDialog1.Filter = "Image Files(*.JPG;*.GIF)|*.JPG;*.GIF|All files (*.*)|*.*"; if (SaveFileDialog1.ShowDialog() == DialogResult.OK) { image1.Save(SaveFileDialog1.FileName, ImageFormat.Bmp); } } } catch { } }以上这段是我乱写的,但数据库的结构是对的.就是传入这个库里边,我都晕了一整天了,,,麻烦大家帮帮忙. 你看一下怎么用C#保存二进制文件到数据库,就知道了,你的Image无须保存到硬盘的, 你看一下怎么用C#保存二进制文件到数据库,就知道了,你的Image无须保存到硬盘的, 首先 你的数据库要是 image 数据类型 然后 你需要一个 得到一个image/Bitmap对象。这个摄像头接口应该已经可以给你了。 然后 BitMap returnImage;//假设这个是你得到的image对象 MemoryStream ms = new MemoryStream(); returnImage = new Bitmap(ms); returnImage .Save(ms, jpegICIinfo, ep); byte[] ima= ms.ToArray(); 你得到的 ima 就是这个图片的 字节模式 ,然后以这个当数据源 通过ado.net 放入数据库中的 image类型字段里 就ok了! returnImage .Save(ms, jpegICIinfo, ep); 这个jpegICIinfo 表示 你要用那种图片格式 比如 jpg gif png 这个 ep 是 指代 压缩等级等参数 当然你也可以直接用 returnImage.Save(ms); bitmap 可以直接与 stream 进行转换,不需要写成磁盘文件 这个流程我再简单说一下 每一个点 你不会就自己查 首先 图片是一堆数字组成的 2维矩阵。 通过 MemoryStream 将一个图片对象 变换成了一个 数字的集合 也就是从 Bitmap 变成了 byte[] 怎么变的我上面的代码有。 然后 就是这么存在数据库里。 SqlServer里有一种数据类型 叫 image 即是让你存储大量数字信息的 你首先要保证 你用来保存图片的字段是image类型的。 然后用innsert语句插入 即可。 Ado.net的代码我不可能给你写。 这里要记住你要写明要放多少数字进去。 一般都是 byte[] 的 length就可以了。 到这里整个过程结束。 Image image1 = (Image)obj1.GetData(typeof(Bitmap)); MemoryStream ms = new MemoryStream(); ((Bitmap)image1).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] ima = ms.ToArray();我现在是写成这样,但是断点发现 byte[] ima = ms.ToArray();里的ima的值是空的 首先 你的 image对象里有东西没 如果有东西 就绝对不会为空 然后额外说一句 数据库大量走 image 数据类型是效率很低下的。 这种情况一般的解决办法,是将image 存在物理路径,然后把路径地址那个string 保存在 数据库中。 效率高 而且易维护。 除非你们要做图像数据分析。那就涉及到高级图像算法,比如人脸识别,图像相似度等,我觉得以你说的需求,应该还没有。 所以 你可以在实现了以上的结构后,如果性能不好,尝试我说的解决方案。 Image image1 = (Image)obj1.GetData(typeof(Bitmap)); MemoryStream stream = new MemoryStream(); ((Bitmap)image1).Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); BinaryReader reader = new BinaryReader(stream); byte[] image_byte = new byte[stream.Length]; reader.Read(image_byte, 0, (int)stream.Length);写成这样image_byte 就有值,但库里没存进文件. 套接字:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。 关于System.Array.BinarySearch()方法很奇怪的问题 ARRAYLIST 相加的问题 Winform诡异的问题 UTF-8解码问题? 求解决思路,关于多客户端有独立数据库,总部有总数据库 .net 2005问题 朋友们帮帮我,现在急需vs.net2002(不是2003)的下载地址,有急用,谢谢各位! Net view 的默认超时怎么设置? datagrid如何实现多行表头? Panel内控件的动态添加删除与显示 System.Security.Permissions.UIPermission 权限失败
{
try
{
Form1.SendMessage(this.hHwnd, 0x41e, 0, 0);
IDataObject obj1 = Clipboard.GetDataObject();
if (obj1.GetDataPresent(typeof(Bitmap)))
{
Image image1 = (Image)obj1.GetData(typeof(Bitmap));
SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
SaveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
SaveFileDialog1.Filter = "Image Files(*.JPG;*.GIF)|*.JPG;*.GIF|All files (*.*)|*.*";
if (SaveFileDialog1.ShowDialog() == DialogResult.OK)
{
image1.Save(SaveFileDialog1.FileName, ImageFormat.Bmp);
}
}
}
catch
{
}
}
{ SqlConnection Con = new SqlConnection("Data Source=Localhost; Initial Catalog=EX_NEW; User ID=sa;Pwd=photosystem;");
string SqlCmd = "INSERT INTO ImageStore (ImageData, ImageContentType, ImageDescription, ImageSize) VALUES (@Image, @ContentType, @ImageDescription, @ImageSize)";
SqlCommand CmdObj = new SqlCommand(SqlCmd, Con);
CmdObj.Parameters.Add("@Image", SqlDbType.Image).Value = textBox1.Text;
CmdObj.Parameters.Add("@ImageDescription", SqlDbType.NVarChar).Value = Convert.ToByte(textBox1.Text); //CmdObj.Parameters.Add("@Image", SqlDbType.Binary, FileLength).Value = FileByteArray;
//CmdObj.Parameters.Add("@ContentType", SqlDbType.VarChar, 50).Value = fs.ContentType; //记录文件类型
//把其它单表数据记录上传
CmdObj.Parameters.Add("@ImageDescription", SqlDbType.VarChar, 200).Value = textBox1.Text;
//记录文件长度,读取时使用
//CmdObj.Parameters.Add("@ImageSize", SqlDbType.BigInt, 8).Value = UpFile.ContentLength; Con.Open(); if (CmdObj.ExecuteNonQuery() == 1)
{
MessageBox.Show("Successfully ");
}
else
{
MessageBox.Show("Failed ");
}
Con.Close();
try
{
Form1.SendMessage(this.hHwnd, 0x41e, 0, 0);
IDataObject obj1 = Clipboard.GetDataObject();
if (obj1.GetDataPresent(typeof(Bitmap)))
{
Image image1 = (Image)obj1.GetData(typeof(Bitmap));
SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
SaveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
SaveFileDialog1.Filter = "Image Files(*.JPG;*.GIF)|*.JPG;*.GIF|All files (*.*)|*.*";
if (SaveFileDialog1.ShowDialog() == DialogResult.OK)
{
image1.Save(SaveFileDialog1.FileName, ImageFormat.Bmp);
}
}
}
catch
{
}
}以上这段是我乱写的,但数据库的结构是对的.就是传入这个库里边,我都晕了一整天了,,,麻烦大家帮帮忙.
然后
你需要一个 得到一个image/Bitmap对象。这个摄像头接口应该已经可以给你了。
然后
BitMap returnImage;//假设这个是你得到的image对象
MemoryStream ms = new MemoryStream();
returnImage = new Bitmap(ms);
returnImage .Save(ms, jpegICIinfo, ep);
byte[] ima= ms.ToArray(); 你得到的 ima 就是这个图片的 字节模式 ,然后以这个当数据源 通过ado.net 放入数据库中的 image类型字段里 就ok了!
这个jpegICIinfo 表示 你要用那种图片格式 比如 jpg gif png
这个 ep 是 指代 压缩等级等参数
当然你也可以直接用
returnImage.Save(ms);
通过 MemoryStream
将一个图片对象 变换成了一个 数字的集合
也就是从 Bitmap 变成了 byte[]
怎么变的我上面的代码有。 然后 就是这么存在数据库里。 SqlServer里有一种数据类型 叫 image
即是让你存储大量数字信息的 你首先要保证 你用来保存图片的字段是image类型的。
然后用innsert语句插入 即可。 Ado.net的代码我不可能给你写。
这里要记住你要写明要放多少数字进去。 一般都是 byte[] 的 length就可以了。 到这里整个过程结束。
MemoryStream ms = new MemoryStream();
((Bitmap)image1).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] ima = ms.ToArray();
我现在是写成这样,但是断点发现 byte[] ima = ms.ToArray();里的ima的值是空的
如果有东西 就绝对不会为空
这种情况一般的解决办法,是将image 存在物理路径,然后把路径地址那个string 保存在 数据库中。
效率高 而且易维护。
除非你们要做图像数据分析。那就涉及到高级图像算法,比如人脸识别,图像相似度等,我觉得以你说的需求,应该还没有。
所以 你可以在实现了以上的结构后,如果性能不好,尝试我说的解决方案。
MemoryStream stream = new MemoryStream();
((Bitmap)image1).Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
BinaryReader reader = new BinaryReader(stream);
byte[] image_byte = new byte[stream.Length];
reader.Read(image_byte, 0, (int)stream.Length);写成这样image_byte 就有值,但库里没存进文件.