你的位置:首页 > ASP.net教程

[ASP.net教程]C#实现拍照并且存水印照片


由于一直在高校工作,就涉及到招生工作,招生时候又要收集学生图像采集,所以就随手写了一个图像采集工具,废话不多说,进入正题。

图像采集需要调用摄像头就行拍照操作,网上查了一下资料,需要引用以下3个dll。

看一下运行界面

界面都比较low,主要是功能实现。

    private void Camera_Load(object sender, EventArgs e)    {      this.btnSave.Enabled = false;      try      {        borderSize = GetBorderSize(this);        captionHeight = GetCaptionHeight(this);        //InitStudent("", "", "");        this.comboBox_SizeMode.Text = "填充(保持比例)";        FilterInfoCollection infos = new FilterInfoCollection(FilterCategory.VideoInputDevice);        if ((infos != null) && (infos.Count > 0))        {        }        else        {          MessageBox.Show("没有视频设备");        }        this.LoadVedio();        this.splitContainer1.Panel2MinSize = 280;        this.splitContainer1.SplitterDistance = this.splitContainer1.Width - this.splitContainer1.Panel2MinSize + 1;        mf = new BorderForm();        mf.Show(this);        //mf.Left = (this.Left + this.splitContainer1.Panel1.Width - mf.Width) / 2;        //mf.Top = (this.Top + this.splitContainer1.Panel1.Height - mf.Height) / 2;        //marLeft = mf.Left - this.Left;        //marTop = mf.Top - this.Top;        Rectangle rtPic = this.pictureBox_Camera.RectangleToScreen(this.pictureBox_Camera.ClientRectangle);        Rectangle rtMF = this.mf.RectangleToScreen(this.mf.ClientRectangle);        if (rtPic == null || rtMF == null || rtPic.Width == 0 || rtMF.Width == 0)        {          return;        }        mf.Left = ((rtMF.Width + rtMF.Left) + (rtPic.Width + rtPic.Left)) / 2;        mf.Top = ((rtMF.Height + rtMF.Top) + (rtPic.Height + rtPic.Top)) / 2;        mf.SizeChanged += new EventHandler(mf_SizeChanged);        mf.LocationChanged += new EventHandler(mf_LocationChanged);        pictureBox_Camera_SizeChanged(sender, e);        //启动连拍        //this.ShootOneTime = 0;        this.timer1.Start();      }      catch (Exception ex)      {        MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);      }    }

//加载摄像头设备private void LoadVedio()    {      FilterInfoCollection infos = new FilterInfoCollection(FilterCategory.VideoInputDevice);      if ((infos != null) && (infos.Count > 0))      {        int index = 0;        foreach (FilterInfo info in infos)        {          this.cmbCaptureDevice.Items.Add(new DeviceInfo(info.Name, info.MonikerString, index, FilterCategory.VideoInputDevice));          index++;        }        this.cmbCaptureDevice.SelectedIndex = 0;      }    }

    /// <summary>    /// 拍照    /// </summary>    private void Shoot()    {      try      {        if (this.pictureBox_Camera.Image != null && (int)this.numericUpDown1.Value > 0 && (int)this.numericUpDown2.Value > 0)        {          Bitmap resultImage = new Bitmap((int)this.numericUpDown1.Value, (int)this.numericUpDown2.Value);          Graphics g = Graphics.FromImage(resultImage);          g.CopyFromScreen(new Point(this.mf.Location.X + 1, this.mf.Location.Y + 1), new Point(6, 6 + (isWin7 ? 2 : 0)), new Size(resultImage.Size.Width, resultImage.Size.Height - (6 + (isWin7 ? 2 : 0))));          if (!string.IsNullOrEmpty(XH))          {            string str = "";            if (this.XH != "")            {              str = this.XH;            }            else if (this.SFZH != "")            {              str = this.SFZH;            }            else if (this.KSH != "")            {              str = this.KSH;            }            if (this.checkBox2.Checked)            {              str = XM + " " + str;            }            int txtWidth = (int)(g.MeasureString(str, new Font("宋体", 9)).Width * 1.1);            Rectangle rec = new Rectangle((resultImage.Width - txtWidth) / 2, resultImage.Height - 16, txtWidth, 15);            g.FillRectangle(Brushes.White, rec);            StringFormat sf = new StringFormat();            sf.LineAlignment = StringAlignment.Center;            sf.Alignment = StringAlignment.Center;            rec.Height++;            g.DrawString(str, new Font("宋体", 9), Brushes.Black, rec, sf);          }          this.pictureBox_tx.Image = resultImage;        }        else        {          this.pictureBox_tx.Image = null;        }      }      catch (Exception ex)      {        MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);      }    }

//选择摄像装置private void cmbCaptureDevice_SelectedIndexChanged(object sender, EventArgs e)    {      if (this.cmbCaptureDevice.SelectedItem != null)      {        this.cmbDeviceCapability.Items.Clear();        VideoCaptureDevice device = new VideoCaptureDevice(((DeviceInfo)this.cmbCaptureDevice.SelectedItem).MonikerString);        for (int i = 0; i < device.VideoCapabilities.Length; i++)        {          VideoCapabilities capabilities = device.VideoCapabilities[i];          DeviceCapabilityInfo item = new DeviceCapabilityInfo(capabilities.FrameSize);          this.cmbDeviceCapability.Items.Add(item);        }        DeviceInfo selectedItem = (DeviceInfo)this.cmbCaptureDevice.SelectedItem;        if (this.captureAForge != null)        {          this.captureAForge.NewFrame -= new NewFrameEventHandler(this.captureAForge_NewFrame);          //this.captureAForge.SnapshotFrame -= new NewFrameEventHandler(this.captureAForge_SnapshotFrame);          if (this.captureAForge.IsRunning)          {            this.captureAForge.SignalToStop();          }          this.captureAForge.WaitForStop();          this.captureAForge = null;        }        this.captureAForge = new VideoCaptureDevice(selectedItem.MonikerString);        this.captureAForge.ProvideSnapshots = true;        this.captureAForge.NewFrame += new NewFrameEventHandler(this.captureAForge_NewFrame);        //this.captureAForge.SnapshotFrame += new NewFrameEventHandler(this.captureAForge_SnapshotFrame);        if (this.cmbDeviceCapability.Items.Count > 0)        {          this.cmbDeviceCapability.SelectedIndex = 0;        }      }    }

//选择分辨率 private void cmbDeviceCapability_SelectedIndexChanged(object sender, EventArgs e)    {      string[] strArray = this.cmbDeviceCapability.Text.Trim().Split(new char[] { 'x' });      int width = int.Parse(strArray[0]);      int height = int.Parse(strArray[1]);      if (this.captureAForge != null)      {        if (this.captureAForge.IsRunning)        {          this.captureAForge.SignalToStop();        }        this.captureAForge.WaitForStop();        this.captureAForge.DesiredFrameSize = new Size(width, height);        this.captureAForge.DesiredSnapshotSize = new Size(width, height);        //this.captureAForge.DesiredFrameRate = 1000;        this.captureAForge.Start();      }    }

//设置数据源大小   private void comboBox_SizeMode_SelectedIndexChanged(object sender, EventArgs e)    {      switch (this.comboBox_SizeMode.Text)      {        case "默认(原始大小)":          this.pictureBox_Camera.SizeMode = PictureBoxSizeMode.Normal;          break;        case "居中(原始大小)":          this.pictureBox_Camera.SizeMode = PictureBoxSizeMode.CenterImage;          break;        case "填充(拉伸图像)":          this.pictureBox_Camera.SizeMode = PictureBoxSizeMode.StretchImage;          break;        case "填充(保持比例)":          this.pictureBox_Camera.SizeMode = PictureBoxSizeMode.Zoom;          break;      }    }

//保存照片private void buttonSave_Click(object sender, EventArgs e)    {      try      {        string filename = Path.Combine(Application.StartupPath, "StuImages", "Newstuimages", this.XH + ".JPG");        if (!this.checkBox1.Checked && File.Exists(filename))        {          if (MessageBox.Show("该生已经有照片文件,是否覆盖?   ", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)          {            //存储到本地            this.pictureBox_tx.Image.Save(filename);            //OnDataChanged(this, new DataEventArgs(string.Format("头像采集(覆盖),学号:{0},姓名:{1},考生号:{2},身份证号:{3}", this.XH, this.XM, this.KSH, this.SFZH)));            this.txtKSH.Focus();            this.txtKSH.SelectAll();          }          else          {            return;          }        }        else        {          this.pictureBox_tx.Image.Save(filename);          //OnDataChanged(this, new DataEventArgs(string.Format("头像采集,学号:{0},姓名:{1},考生号:{2},身份证号:{3}", this.XH, this.XM, this.KSH, this.SFZH)));          this.txtKSH.Focus();          this.txtKSH.SelectAll();        }        this.timer1.Start();      }      catch      {      }      finally      {        //启用下面一行,点击保存后头像会立即启动刷新        //this.timer1.Start();        this.btnSave.Enabled = false;      }    }

保存照片可以选择自动覆盖同名照片或者在照片中加入水印效果。

操作时候可以自行拖动长方形的框进行选择拍照

 源码下载:http://files.cnblogs.com/files/luoxiaozhao/Image_acquisitionForm.rar

请支持原创,转载请标明来源。