C#攝像頭實現(xiàn)拍照功能的簡單代碼示例
作者:佚名
這里將介紹一個C#攝像頭實現(xiàn)拍照功能的簡單代碼示例,代碼雖然不短,但是基本上實現(xiàn)了相對應(yīng)的功能,希望對大家有所幫助。
C#攝像頭實現(xiàn)拍照功能的簡單代碼示例
- using System;
- using System.Runtime.InteropServices;
- using System.Drawing;
- using System.Drawing.Imaging;
- namespace Video
- {
- ///
- /// 一個C#攝像頭控制類
- ///
- public class VideoWork
- {
- private const int WM_USER = 0x400;
- private const int WS_CHILD = 0x40000000;
- private const int WS_VISIBLE = 0x10000000;
- private const int WM_CAP_START = WM_USER;
- private const int WM_CAP_STOP = WM_CAP_START + 68;
- private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
- private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
- private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
- private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
- private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
- private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
- private const int WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63;
- private const int WM_CAP_SET_OVERLAY =WM_CAP_START+ 51;
- private const int WM_CAP_SET_PREVIEW =WM_CAP_START+ 50;
- private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
- private const int WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
- private const int WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
- private const int WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
- private const int WM_CAP_SET_SCALE=WM_CAP_START+ 53;
- private const int WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52;
- private IntPtr hWndC;
- private bool bWorkStart = false;
- private IntPtr mControlPtr;
- private int mWidth;
- private int mHeight;
- private int mLeft;
- private int mTop;
- ///
- /// 初始化顯示圖像
- ///
- /// 控件的句柄
- /// 開始顯示的左邊距
- /// 開始顯示的上邊距
- /// 要顯示的寬度
- /// 要顯示的長度
- public VideoWork(IntPtr handle, int left, int top, int width,int height)
- {
- mControlPtr = handle;
- mWidth = width;
- mHeight = height;
- mLeft = left;
- mTop = top;
- }
- [DllImport("avicap32.dll")]
- private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
- [DllImport("avicap32.dll")]
- private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize );
- [DllImport("User32.dll")]
- private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam);
- ///
- /// 開始顯示圖像
- ///
- public void Start()
- {
- if (bWorkStart)
- return;
- bWorkStart = true;
- byte[] lpszName = new byte[100];
- hWndC = capCreateCaptureWindowA(lpszName,WS_CHILD|WS_VISIBLE ,mLeft,mTop,mWidth,mHeight,mControlPtr,0);
- if (hWndC.ToInt32() != 0)
- {
- SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
- SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
- SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
- SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
- SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
- SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
- SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
- SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
- //Global.log.Write("SendMessage");
- }
- return;
- }
- ///
- /// 停止顯示
- ///
- public void Stop()
- {
- SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
- bWorkStart = false;
- }
- ///
- /// 抓圖
- ///
- /// 要保存bmp文件的路徑
- public void GrabImage(string path)
- {
- IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
- SendMessage(hWndC,WM_CAP_SAVEDIB,0,hBmp.ToInt64());
- }
- }
- }
- 這是一個控制攝像頭進行拍照的類,我每次使用GrabImage抓圖都是225K的一張照片,我想請問如何才能讓我抓到的圖片小一些,我想控制在70K左右。不知怎么讓拍照的像素變?。?
- if(this.Request.QueryString["filename"]!=null)
- {
- //獲取原圖片
- string filename=this.Request.QueryString["filename"];
- Bitmap bmpOld=new Bitmap(this.Server.MapPath("images/" + filename));
- //計算縮小比例
- double d1;
- if(bmpOld.Height>bmpOld.Width)
- d1=(double)(MaxLength/(double)bmpOld.Width);
- else
- d1=(double)(MaxLength/(double)bmpOld.Height);
- //產(chǎn)生縮圖
- Bitmap bmpThumb=new Bitmap(bmpOld,(int)(bmpOld.Width*d1),(int)(bmpOld.Height*d1));
- //清除緩沖
- Response.Clear();
- //生成圖片
- bmpThumb.Save(this.Response.OutputStream,ImageFormat.Jpeg);
- Response.End();
- //釋放資源
- bmpThumb.Dispose();
- bmpOld.Dispose();
- }
C#攝像頭實現(xiàn)拍照功能的簡單代碼示例就介紹到這里。
【編輯推薦】
責(zé)任編輯:彭凡
來源:
51CTO