博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
winform摄像头拍照 C#利用摄像头拍照
阅读量:4562 次
发布时间:2019-06-08

本文共 10784 字,大约阅读时间需要 35 分钟。

这是我的第一篇博文,决定以后每个程序都要记录下来,方便以后查阅!

本人小菜一名,本程序也是查阅了网上各位前辈的博客和百度知道所整理出来的一个小程序。

第一次写有点不知道从何写起,先贴一张程序图吧。

 

程序功能,导入Excel用户模板,模板图如下

通过身份证查找用户,根据准考证好生成图片名。

 

 

下面开始进入程序

利用摄像头拍照需要调用win32的avicap32.dll和user32.dll。

avicap32.dll:Windows NT 4.0  avicap32.dll是Windows API应用程序接口相关模块,用于对摄像头和其它视频硬件进行AⅥ电影和视频的截取。

user32.dll:user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。

 

代码部分

 

1  private int hHwnd = 0; 2         private const int port = 2000; 3         private DataTable dtExcel; 4         private string imgName; 5         public CameraForm() 6         { 7             InitializeComponent(); 8         } 9         public struct videohdr_tag10         {11             public byte[] lpData;12             public int dwBufferLength;13             public int dwBytesUsed;14             public int dwTimeCaptured;15             public int dwUser;16             public int dwFlags;17             public int[] dwReserved;18 19         }

 

1  ///       2         ///   必需的设计器变量。    3         ///       4  5         [DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 6         public static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)]   ref   string lpszWindowName, int dwStyle, int x, int y, int nWidth, short nHeight, int hWndParent, int nID); 7         [DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 8         public static extern bool capGetDriverDescriptionA(short wDriver, [MarshalAs(UnmanagedType.VBByRefStr)]   ref   string lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)]   ref   string lpszVer, int cbVer); 9         [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]10         public static extern bool DestroyWindow(int hndw);11         [DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]12         public static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)]   object lParam);13         [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]14         public static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);15         [DllImport("vfw32.dll")]16         public static extern string capVideoStreamCallback(int hwnd, videohdr_tag videohdr_tag);17         [DllImport("vicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

接下来就要开始要调用摄像头打开

1         ///  2         /// 开启摄像头 3         ///  4         ///  5         ///  6         private void button1_Click(object sender, EventArgs e) 7         { 8             if (hHwnd == 0) 9                 this.OpenCapture();10             else11                 MessageBox.Show("摄像头已经开启!","提示");12         }
1      ///  2         /// 打开摄像头 3         ///  4         private void OpenCapture() 5         { 6             int intWidth = this.panel1.Width; 7             int intHeight = this.panel1.Height; 8             int intDevice = 0; 9             string refDevice = intDevice.ToString();10             //创建视频窗口并得到句柄11             hHwnd = CameraForm.capCreateCaptureWindowA(ref   refDevice, 1342177280, 0, 0, 600, 480, this.panel1.Handle.ToInt32(), 0);12             if (CameraForm.SendMessage(hHwnd, 0x40a, intDevice, 0) > 0)13             {14                 CameraForm.SendMessage(this.hHwnd, 0x435, -1, 0);15                 CameraForm.SendMessage(this.hHwnd, 0x434, 0x42, 0);16                 CameraForm.SendMessage(this.hHwnd, 0x432, -1, 0);17                 CameraForm.SetWindowPos(this.hHwnd, 1, 0, 0, intWidth, intHeight, 6);18             }19             else20             {21                 CameraForm.DestroyWindow(this.hHwnd);22             }23         }

capCreateCaptureWindowA的作用是创建一个视频窗口,摄像头捕捉到的视频图像在此窗口内显示,函数返回值就是代表此窗口的句柄。

接下来关闭摄像头

1         ///  2         ///关闭摄像头 3         ///  4         ///  5         ///  6         private void button2_Click(object sender, EventArgs e) 7         { 8             //停止视频注销视频句柄 9             CameraForm.SendMessage(this.hHwnd, 0x40b, 0, 0);10             CameraForm.DestroyWindow(this.hHwnd);11             hHwnd = 0;12         }

然后是拍照

1   ///  2         /// 截图 3         ///  4         ///  5         ///  6         private void button3_Click(object sender, EventArgs e) 7         { 8             if (hHwnd == 0) 9             {10                 MessageBox.Show("请先开启摄像头!","提示");11                 return;12             }13             Preview dlg = new Preview();14             try15             {16                 CameraForm.SendMessage(this.hHwnd, 0x41e, 0, 0);17                 IDataObject obj1 = Clipboard.GetDataObject();18                 if (obj1.GetDataPresent(typeof(Bitmap)))19                 {20                     Rectangle rect = new Rectangle(120, 145, 120, 145);21                     Image image1 = (Image)obj1.GetData(typeof(Bitmap));22                     Bitmap bit = (Bitmap)image1;23                     //MessageBox.Show( bit.Height.ToString());24                     //MessageBox.Show(bit.Width.ToString());25 26                     bit = bit.Clone(new Rectangle(121, 0, 397, 480), System.Drawing.Imaging.PixelFormat.Format32bppArgb);27                     bit = (Bitmap)GetThumbnailImage(bit, 120, 145);28                     dlg.Img = bit;29                     dlg.ImgName = imgName;30                 }31             }32             catch33             {34             }35             dlg.ShowDialog();36         }
1  ///  2         /// 将某个图像生成指定尺寸的图像缩放图 3         ///  4         /// 原图像 5         /// 新的图像宽 6         /// 新的图像高 7         /// 
8 private Image GetThumbnailImage(Bitmap myBitmap, int width, int height) 9 {10 11 //生成图像的缩放图 12 Image.GetThumbnailImageAbort myCallback =13 new Image.GetThumbnailImageAbort(ThumbnailCallback);14 15 Image myThumbnail = myBitmap.GetThumbnailImage(16 width, height, myCallback, IntPtr.Zero);17 //this.pictureBox1.Image = myThumbnail;18 19 return myThumbnail;20 }21 public bool ThumbnailCallback()22 {23 return false;24 }

 

 

最后是保存截图

1  private void button1_Click(object sender, EventArgs e) 2         { 3             SaveFileDialog SaveFileDialog1 = new SaveFileDialog(); 4             SaveFileDialog1.FileName = imgName; 5             SaveFileDialog1.Filter = "Image Files(*.JPG;*.GIF)|*.JPG;*.GIF|All files (*.*)|*.*"; 6             if (SaveFileDialog1.ShowDialog() == DialogResult.OK) 7             { 8                 img.Save(SaveFileDialog1.FileName, ImageFormat.Bmp); 9                 this.Close();10             }11         }

 

下面是操作Excel

首先判断Excel版本

1  ///  2         /// 检测Excel版本信息 3         ///  4         /// 
5 public static double JongCheckExcelVer() 6 { 7 Type objExcelType = Type.GetTypeFromProgID("Excel.Application"); 8 if (objExcelType == null) 9 {10 return 0;11 }12 object objApp = Activator.CreateInstance(objExcelType);13 if (objApp == null)14 {15 return 0;16 }17 object objVer = objApp.GetType().InvokeMember("Version", BindingFlags.GetProperty, null, objApp, null);18 double iVer = Convert.ToDouble(objVer.ToString());19 objVer = null;20 objApp = null;21 objExcelType = null;22 GC.Collect();23 return iVer;24 }25 26 public static String JongGetExcelVerStr()27 {28 String s1;29 double excelver;30 excelver = JongCheckExcelVer();// ExistsExcelRegedit();31 s1 = " Office ";32 if (excelver == 0)33 {34 MessageBox.Show("無法識別Excel的版本", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Information);35 s1 = "無法識別 office 版本";36 }37 else if (excelver >= 14) s1 += "2010或以上";38 else if (excelver >= 12) s1 += "2007";39 else if (excelver >= 11) s1 += "2003";40 else if (excelver >= 10) s1 += "XP";41 else if (excelver >= 9) s1 += "2000";42 else if (excelver >= 8) s1 += "97";43 else if (excelver >= 7) s1 += "95";44 45 return s1;46 }

 

 接着是导入到DataTable

///         /// 导入excel到datata        ///         ///         ///         private void button5_Click(object sender, EventArgs e)        {            System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();            try            {                if (fd.ShowDialog() == DialogResult.OK)                {                    DataSet ds = new DataSet();                    string strConn = "";                    if (JongCheckExcelVer() >= 12)                    {                        strConn = "Provider=Microsoft.Ace.OLEDB.12.0;" + "Data Source=" + fd.FileName + ";" + "Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";                    }                    else if (JongCheckExcelVer() >= 8)                    {                        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fd.FileName + ";" + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";                    }                    else if (JongCheckExcelVer() == 0)                    {                        MessageBox.Show("无法识别Excel的版本", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);                    }                    OleDbConnection conn = new OleDbConnection(strConn);                    conn.Open();                    string strExcel = "";                    //string strSheet = "";                    string strSheetName = "";                    OleDbDataAdapter myCommand = null;                    DataTable dtExcelName = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);                    strSheetName = dtExcelName.Rows[0][2].ToString();                                        strExcel = string.Format("select * from [{0}$]", "Sheet1"); //Bicycle为excel中工作薄                    myCommand = new OleDbDataAdapter(strExcel, strConn);                    myCommand.Fill(ds, "Sheet1");                    System.Data.DataTable dt = new System.Data.DataTable();                    dt = ds.Tables[0];                    dtExcel = dt;                    MessageBox.Show("导入成功!","提示");                }                else                    MessageBox.Show("导入失败!","提示");            }            catch            {                MessageBox.Show("请选择相应的excel文件", "警告");            }        }

 

 

本程序代码大部分来之互联网,如有雷同,纯属必然。 可以加群讨论,群里有各种源码,资料: 215269573

 

 

 

 

转载于:https://www.cnblogs.com/zm-1110/p/3253082.html

你可能感兴趣的文章
雷林鹏分享: C# 简介
查看>>
ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法
查看>>
实用类-<Math类常用>
查看>>
构建之法阅读笔记之四
查看>>
10.15习题2
查看>>
Windows Server 2008 R2 备份与恢复详细实例
查看>>
Ubuntu上kubeadm安装Kubernetes集群
查看>>
关于java学习中的一些易错点(基础篇)
查看>>
MFC的多国语言界面的实现
查看>>
四则运算个人项目 最终版
查看>>
java线程系列---java5中的线程池
查看>>
SQL表连接
查看>>
新秀系列C/C++经典问题(四)
查看>>
memset函数具体说明
查看>>
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
1033. 旧键盘打字(20)
查看>>
The Zen of Python
查看>>
git安装及使用
查看>>
mysql一个非常实用解决sql查询优化的函数explain
查看>>