写了一个DELPHI操作USB摄像头类分享给大家
来源:互联网 发布:淘宝r店是什么意思啊 编辑:程序博客网 时间:2024/06/05 04:20
最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家
{*******************************************************}{ }{ 操作USB摄像头类 }{ }{ 作者:lqen }{ 日期:2015.05.18 }{ }{*******************************************************}unit untUsbCamera;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg;const WM_CAP_START = WM_USER;const WM_CAP_STOP = WM_CAP_START + 68;const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;const WM_CAP_SAVEDIB = WM_CAP_START + 25;const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;const WM_CAP_SEQUENCE = WM_CAP_START + 62;const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;const WM_CAP_SET_OVERLAY = WM_CAP_START + 51;const WM_CAP_SET_PREVIEW = WM_CAP_START + 50;const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;const WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;const WM_CAP_SET_SCALE = WM_CAP_START + 53;const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 41; //打开视频格式设置对话框,选择数字视频的框架大小和视频图像的色深,以及捕获视频图像的压缩格式。type TUsbCamera = class private FPanel: TPanel; hWndC: THandle; //定义捕捉窗句柄 FIsOpen: boolean; function BmpToJpg(BmpPath: string): string; function Image_FitBitmap(const Source, Dest: string; const x, y: integer): Boolean; protected public constructor Create(); destructor Destroy; override; function Play(Panel: TPanel): boolean; function Stop: boolean; function StartRecord(FileName: string): Boolean; function StopRecord: Boolean; function Capture(FileName: string): Boolean; published property IsOpen: boolean read FIsOpen write FIsOpen; end;function capCreateCaptureWindowA(lpszWindowName: PCHAR; dwStyle: longint; x: integer; y: integer; nWidth: integer; nHeight: integer; ParentWin: HWND; nId: integer): HWND; STDCALL EXTERNAL 'AVICAP32.DLL';implementation{ TUsbCamera }function TUsbCamera.BmpToJpg(BmpPath: string): string;var Jpg: TJpegImage; BMP: TBitMap;begin Result := ''; BmpPath := Trim(BmpPath); Jpg := TJpegImage.Create; BMP := TBitmap.Create; try BMP.LoadFromFile(BmpPath); Jpg.Assign(BMP); Jpg.SaveToFile(Copy(BmpPath, 1, Length(BmpPath) - 3) + 'jpg'); Result := Copy(BmpPath, 1, Length(BmpPath) - 3) + 'jpg'; finally BMP.Free; Jpg.Free; BMP := nil; Jpg := nil; end;end;function TUsbCamera.Image_FitBitmap(const Source, Dest: string; const x, y: integer): Boolean;var abmp, bbmp: tbitmap; //定义变量 abmp为源对象变量 bbmp为目的对象变量begin abmp := tbitmap.Create; //创建位图资源 bbmp := tbitmap.Create; //创建位图资源 try abmp.LoadFromFile(Source); //载入源位图资源 bbmp.Width := x; //设置目的位图的宽 bbmp.Height := y; //设置目的位图的高 bbmp.PixelFormat := pfDevice; //设置位图格式为当前设备默认格式 SetStretchBltMode(bbmp.Canvas.Handle, COLORONCOLOR); //设置指位图拉伸模式 StretchBlt(bbmp.Canvas.Handle, 0, 0, bbmp.Width, bbmp.Height, abmp.Canvas.Handle, 0, 0, abmp.Width, abmp.Height, srccopy); //从源矩形中复制一个位图到目标矩形并适当压缩 bbmp.SaveToFile(Dest); //保存转换后的目的图片 finally abmp.Free; //释放资源 bbmp.Free; //释放资源 end;end;function TUsbCamera.Capture(FileName: string): boolean;begin Result := False; if hWndC <> 0 then begin ForceDirectories(ExtractFilePath(FileName)); if SendMessage(hWndC, WM_CAP_SAVEDIB, 0, longint(pchar(FileName))) <> 1 then exit; //截图 if FileExists(FileName) then begin Image_FitBitmap(FileName, FileName, 400, 400); FileName := BmpToJpg(FileName); Result := True; end; end;end;constructor TUsbCamera.Create();beginend;destructor TUsbCamera.Destroy;begin Stop; inherited;end;function TUsbCamera.Play(Panel: TPanel): boolean;begin Result := False; FPanel := Panel; //使用Tpanel控件来创建捕捉窗口 hWndC := CapCreateCaptureWindowA('My Own Capture Window', WS_CHILD or WS_VISIBLE, //窗口样式 0, //X坐标 0, //Y坐标 FPanel.Width, //窗口宽 FPanel.Height, //窗口高 FPanel.Handle, //窗口句柄 0); //一般为0 if hWndC <> 0 then begin if SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0) <> 1 then exit; //捕捉一个视频流 if SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0) <> 1 then exit; //得到一个设备错误 if SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0) <> 1 then exit; //得到一个设备状态 if SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0) <> 1 then exit; //将一个捕捉窗口与一个设备驱动相关联 if SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0) <> 1 then exit; if SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0) <> 1 then exit; SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); if SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0) <> 1 then exit; Result := True; FIsOpen := True; end;end;function TUsbCamera.StartRecord(FileName: string): Boolean;begin Result := False; if hWndC <> 0 then begin SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, Longint(pchar(FileName))); // 录成AVI Result := SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0) = 1; end;end;function TUsbCamera.StopRecord: Boolean;begin Result := False; if hWndC <> 0 then Result := SendMessage(hWndC, WM_CAP_STOP, 0, 0) = 1;end;function TUsbCamera.Stop: boolean;begin Result := False; if hWndC <> 0 then begin Result := SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0) = 1; //将捕捉窗同驱动器断开 FIsOpen := False; end;end;end.
0 0
- 写了一个DELPHI操作USB摄像头类分享给大家
- 自己写了一个带placeHolder的textView,分享给大家
- 写了一个ES6(ES2015)模块可用的xml2json插件,给大家分享一下
- 赞一个,写出了我的心声!!分享给大家!
- 原创:老司机为教老婆学Python,星期天用Python写了一个俄罗斯方块程序。现在分享给大家,供大家闲暇时娱乐。
- 前两天写了一个ini文件解析类,感觉还不错,和大家分享一下:)
- 给大家一个数据库操作类。应该来说很全了。我自己用的。
- 今天堂哥给我介绍了一个很好的博客,给大家分享一下
- 给大家分享一个自定义Winform控件类
- 图片上传的一个类 分享给大家
- 一个矩阵类,很好用,分享给大家
- 分享给大家一个简单的数据导出excel类
- 自己写了很久的.net论坛源代码分享给大家
- (Robotium)写了个滑动屏幕的方法,分享给大家
- 给大家推荐一个好的网络资源,分享给大家。。。
- 给大家分享一个常用链表类Clist
- 好久没有写博客了 今天来给大家分享一点小经验吧 关于 VirusTotal的扫毒经验分享
- 做了一个GRE的实验。把配置粘下来给大家分享。
- Android Network -------------------判断网络状态(网络的连接,改变,和判断2G/3G/4G)
- 第十一周项目2——(1)职员有薪水了
- 第十一周项目1(1)-存储班长信息的学生类
- 解决Java Web对Linux服务器不能上传文件的难题
- 模拟form表单提交(包含文件上传)
- 写了一个DELPHI操作USB摄像头类分享给大家
- Frei-Chen edge detector
- Android属性设置android:noHistory="true"
- windows下搭建svn服务器
- HDU 4586(数学期望)
- android:windowSoftInputMode属性详解
- 面试常见Java集合类(一)
- 我的减脂增肌计划
- buffer和FIFO的区别