功能简介:程序运行后点击拍照,直接显示摄像区,点击截取图片可以截取一张照片,并存入数据库,但是不能改变照片的大小,我想拍摄出特定大小的照片,一寸的。有没有能帮忙的啊using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Data.SqlClient;
using System.Configuration;namespace 摄像头
{
    public partial class CameraForm : Form
    {
        /// <summary>
        /// 获取系统安装的摄像头列表
        /// </summary>
        /// <returns>返回格式:0|USB视频设备|1|USB摄像头,其中0或1是摄像头ID</returns>
        [DllImport("VedioCapture.dll")]
        private extern static string GetCameraList();
        /// <summary>
        /// 设置打开的摄像头ID
        /// </summary>
        /// <param name="value">GetCameraList中列举的摄像头ID</param>
        /// <returns>返回0,设置成功</returns>
        [DllImport("VedioCapture.dll")]
        private extern static int SetCameraID(int value);
        /// <summary>
        /// 打开SetCameraID中设置的摄像头
        /// </summary>
        /// <param name="Handle">要显示视频的控件</param>
        /// <returns>摄像头句柄</returns>
        [DllImport("VedioCapture.dll")]
        private extern static IntPtr StartCamera(IntPtr Handle);
        /// <summary>
        /// 关闭摄像头
        /// </summary>
        /// <param name="hWndC">摄像头句柄</param>
        /// <returns>返回0,设置成功</returns>
        [DllImport("VedioCapture.dll")]
        private extern static int CloseCamera(IntPtr hWndC);
        /// <summary>
        /// 截取BMP格式的视频图像
        /// </summary>
        /// <param name="hWndC">摄像头句柄</param>
        /// <param name="cFileName">截取的bmp文件名,或则-1(代表内存图片)</param>
        /// <returns>如果cFileName传入文件名,返回0,截取成功;如果cFileName传入-1,返回bmp图片的句柄(请使用后注意释放)</returns>
        [DllImport("VedioCapture.dll")]
        private extern static int SaveBmp(IntPtr hWndC, string cFileName);
        /// <summary>
        /// 开始录制视频
        /// </summary>
        /// <param name="hWndC">摄像头句柄</param>
        /// <param name="cFileName">视频文件名</param>
        /// <returns>返回0,开始录制</returns>
        [DllImport("VedioCapture.dll")]
        private extern static int RecordVideo(IntPtr hWndC, string cFileName);
        /// <summary>
        /// 停止录制视频
        /// </summary>
        /// <param name="hWndC">摄像头句柄</param>
        /// <returns>返回0,停止成功</returns>
        [DllImport("VedioCapture.dll")]
        private extern static int StopRecord(IntPtr hWndC);
        /// <summary>
        /// 将现有的图片文件制作成视频,仅支持bmp和jpg格式的图片
        /// </summary>
        /// <param name="cPath">图片文件所在路径,以/结尾</param>
        /// <param name="cFileName">制作后的视频文件名</param>
        /// <param name="cFileType">图片类型:jpg或bmp</param>
        /// <param name="FrameRate">视频写入帧率,摄像头常用15帧,</param>
        /// <returns>返回0,制作成功</returns>
        [DllImport("VedioCapture.dll")]
        private extern static int CreateVideoByFiles(string cPath, string cFileName, string cFileType, int FrameRate);        string AppPath = "";
        public CameraForm()
        {
            InitializeComponent();
            AppPath = Application.StartupPath + "\\";
            
        }        private void button1_Click(object sender, EventArgs e)
        {
            try
            {                listView1.Items.Clear();
                string[] strdev = GetCameraList().Split('|');
                if (strdev.Length < 2) return;
                int i = 0;
                ListViewItem lvi = null;
                while (i < strdev.Length)
                {
                    if (strdev[i] != "")
                    {
                        lvi = new ListViewItem(strdev[i]);
                        lvi.SubItems.Add(strdev[i + 1]);
                        listView1.Items.Add(lvi);
                    }
                    i = i + 2;                }
            }
            catch
            {
                MessageBox.Show("没有设备!");
            }
        }
        IntPtr camerah = IntPtr.Zero;
        private void button2_Click(object sender, EventArgs e)
        {
            if (listView1.SelectedItems == null || listView1.SelectedItems.Count == 0) return;
            string DevIndex = listView1.SelectedItems[0].Text;
            int Result = SetCameraID(int.Parse(DevIndex));
            if (Result != 0)
            {
                MessageBox.Show("设备打开失败");
                return;
            }
            camerah = StartCamera(panel1.Handle);
        }        private void button3_Click(object sender, EventArgs e)
        {
            CloseCamera(camerah);
        }        private void button4_Click(object sender, EventArgs e)
        {
            if (camerah != IntPtr.Zero)
            {
                //传入文件路径
                string path;
                this.saveFileDialog1.Filter = "图片*.bmp;*.jpg;.jpeg;*.gif|*.bmp|所有文件(*.*)|*.*";
                if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    path = this.saveFileDialog1.FileName;
                    SaveBmp(camerah, path);
                    //传入-1,返回内存图片
                    IntPtr iptr = (IntPtr)SaveBmp(camerah, "-1");
                    Bitmap bmp = Bitmap.FromHbitmap(iptr);
                   // Bitmap bitNew = new Bitmap(path, 80, 100);
                    bmp.Save(path);
                    bmp.Dispose();
                    byte[] photo = PhotoToArray(path);
                    SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["video"].ToString());
                    cn.Open();                    try
                    {
                        string sql = "insert into vedio(photo,beizhu) values(@picture,'张三')";
                        //string sql = "update shexiangtou set photo=(@picture) where id=1";  //这个Id测试的时候可以写死,可以改
                        //string sql = "update vedio set beizhu=(@picture) where id=1";
                        SqlParameter param = new SqlParameter();
                        param = new SqlParameter("@picture", SqlDbType.Image);
                        //param = new SqlParameter("@picture", SqlDbType.NVarChar);
                        param.Value = photo;
                        SqlCommand commd = new SqlCommand(sql, cn);
                        commd.Parameters.Add(param);                        int i = commd.ExecuteNonQuery();
                        if (i > 0)
                        {
                            MessageBox.Show("图片插入成功!");
                        }
                        else
                        {
                            //MessageBox.Show("更新图片失败!");
                        }
                    }
                    catch (Exception ex)
                    {                    }
                    finally
                    {
                        cn.Close();
                    }
                }
            }
        }
       

解决方案 »

  1.   

     //将图片信息转换成二进制信息
            private byte[] PhotoToArray(string path)
            {
                FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
                byte[] bufferPhoto = new byte[stream.Length];
                stream.Read(bufferPhoto, 0, Convert.ToInt32(stream.Length));
                stream.Flush();
                stream.Close();
                return bufferPhoto;
            }        //private void button5_Click(object sender, EventArgs e)
            //{
            //    if (camerah != IntPtr.Zero)
            //        RecordVideo(camerah, AppPath + DateTime.Now.ToString("yyyyMMddHHmmss") + ".avi");
            //}        private void button6_Click(object sender, EventArgs e)
            {
                if (camerah != IntPtr.Zero) StopRecord(camerah);
            }        private void button7_Click(object sender, EventArgs e)
            {
                FolderBrowserDialog fbd = new FolderBrowserDialog();
                fbd.SelectedPath = AppPath;
                if (fbd.ShowDialog() != DialogResult.OK)
                {
                    fbd.Dispose();
                    return;
                }
                string path = fbd.SelectedPath;
                int Result = CreateVideoByFiles(path + "\\", AppPath + "test.avi", "jpg", 15);
                if (Result == 0) MessageBox.Show("生成完毕");
            }        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {        }        private void button5_Click(object sender, EventArgs e)
            {
                SqlConnection connect = new SqlConnection(ConfigurationSettings.AppSettings["video"].ToString());
                connect.Open();
                string strSQL = "Select [photo] From [vedio] Where [id]=(@id)"; 
                SqlParameter param = new SqlParameter();
                param = new SqlParameter("@id", SqlDbType.Int);
                param.Value = textBox1.Text;  //测试的时候可以写死如param.Value=1            SqlCommand cmd = new SqlCommand(strSQL, connect);
                cmd.Parameters.Add(param);
                SqlDataReader reader = cmd.ExecuteReader();            reader.Read();
                byte[] pic = (byte[])reader["photo"];            
                
                MemoryStream ms = new MemoryStream(pic);
                System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
                this.pictureBox1.Image = image;
            }        private void CameraForm_Load(object sender, EventArgs e)
            {            //SqlConnection connect = new SqlConnection(ConfigurationSettings.AppSettings["video"].ToString());
                //connect.Open();
                //SqlDataAdapter sa = new SqlDataAdapter("select id from vedio",connect);
                //DataTable dt = new DataTable();
                //sa.Fill(dt);
                //connect.Close();
                try
                {
                    string[] strdev = GetCameraList().Split('|');
                    if (strdev.Length < 2)
                    {
                        MessageBox.Show("没有设备!");                }
                    else if (strdev.Length == 3)
                    {
                        string DevIndex = strdev[0];
                        int Result = SetCameraID(int.Parse(DevIndex));
                        if (Result != 0)
                        {
                            MessageBox.Show("设备打开失败");
                            return;
                        }
                        camerah = StartCamera(panel1.Handle);
                    }                else
                    {                }
                }
                catch
                {
                    MessageBox.Show("没有设备!");
                }
            }       
           
        }
    }