一个DELPHI操作USB摄像头类
最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家
{*******************************************************}
{ }
{ 操作USB摄像头类 }
{ }
{ 作者:lqen }
{ 日期:2015.05.18 }
{ }
{*******************************************************}
unit untUsbCamera;
interface
uses
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 + ;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + ;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + ;
const WM_CAP_SAVEDIB = WM_CAP_START + ;
const WM_CAP_GRAB_FRAME = WM_CAP_START + ;
const WM_CAP_SEQUENCE = WM_CAP_START + ;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + ;
const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + ;
const WM_CAP_SET_OVERLAY = WM_CAP_START + ;
const WM_CAP_SET_PREVIEW = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + ;
const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + ;
const WM_CAP_SET_SCALE = WM_CAP_START + ;
const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + ;
const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + ; //打开视频格式设置对话框,选择数字视频的框架大小和视频图像的色深,以及捕获视频图像的压缩格式。
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, , Length(BmpPath) - ) + 'jpg');
Result := Copy(BmpPath, , Length(BmpPath) - ) + '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, , , bbmp.Width, bbmp.Height, abmp.Canvas.Handle, , , 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 <> then
begin
ForceDirectories(ExtractFilePath(FileName));
if SendMessage(hWndC, WM_CAP_SAVEDIB, , longint(pchar(FileName))) <> then exit; //截图
if FileExists(FileName) then
begin
Image_FitBitmap(FileName, FileName, , );
FileName := BmpToJpg(FileName);
Result := True;
end;
end;
end;
constructor TUsbCamera.Create();
begin
end;
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, //窗口样式
, //X坐标
, //Y坐标
FPanel.Width, //窗口宽
FPanel.Height, //窗口高
FPanel.Handle, //窗口句柄
); //一般为0
if hWndC <> then
begin
if SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, , ) <> then exit;
//捕捉一个视频流
if SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, , ) <> then exit; //得到一个设备错误
if SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, , ) <> then exit; //得到一个设备状态
if SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, , ) <> then exit;
//将一个捕捉窗口与一个设备驱动相关联
if SendMessage(hWndC, WM_CAP_SET_SCALE, , ) <> then exit;
if SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, , ) <> then exit;
SendMessage(hWndC, WM_CAP_SET_OVERLAY, , );
if SendMessage(hWndC, WM_CAP_SET_PREVIEW, , ) <> then exit;
Result := True;
FIsOpen := True;
end;
end;
function TUsbCamera.StartRecord(FileName: string): Boolean;
begin
Result := False;
if hWndC <> then
begin
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, , Longint(pchar(FileName))); // 录成AVI
Result := SendMessage(hWndC, WM_CAP_SEQUENCE, , ) = ;
end;
end;
function TUsbCamera.StopRecord: Boolean;
begin
Result := False;
if hWndC <> then Result := SendMessage(hWndC, WM_CAP_STOP, , ) = ;
end;
function TUsbCamera.Stop: boolean;
begin
Result := False;
if hWndC <> then
begin
Result := SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, , ) = ; //将捕捉窗同驱动器断开
FIsOpen := False;
end;
end;
end.
一个DELPHI操作USB摄像头类的更多相关文章
- 安卓 USB摄像头 开源库 UVCCamera 教程
https://github.com/saki4510t/UVCCamera UVCCamera 听名字就知道使用UVC( USB VEDIO CLASS) 协议的通用类库.linux原生支持,基本支 ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 25、写一个USB摄像头驱动程序(有ioctrl分析)
videobuf2-core.h中的vb2_buffer,记录了v4l2_buffer ,驱动可以对vb2_buffer的v4l2_buffer进行操控, vb2_buffer是v4l2框架层的代码, ...
- 摄像头调用代码 笔记本的话,本身有一个摄像头,由于用的usb摄像头,需要把笔记本的摄像头禁用后,再使用
摄像头调用代码 笔记本的话,本身有一个摄像头,由于用的usb摄像头,需要把笔记本的摄像头禁用后,再使用 <!DOCTYPE html> <html lang="en&quo ...
- Linux USB摄像头驱动【转】
本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 ...
- Linux USB 摄像头驱动
在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 USB 接口的摄像头.这一章主要是介绍 USB 摄像头的设备驱动程序.在我们印象中,驱动程序都是一个萝卜一个坑, ...
- Delphi操作XML简介
参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...
- USB 设备类协议入门【转】
本文转载自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一.应用场合 USB HID类是比较大的一个类,HID类设备属 ...
- USB CDC类
现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中.但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失.于是嵌入式开发人员常常发 ...
随机推荐
- BZOJ1977或洛谷4180 [BJWC2010]次小生成树
一道LCA+生成树 BZOJ原题链接 洛谷原题链接 细节挺多,我调了半天..累炸.. 回到正题,我们先求出随便一棵最小生成树(设边权和为\(s\)),然后扫描剩下所有边,设扫到的边的两端点为\(x,y ...
- 1.1 Java 的概述
[什么是java]:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是有SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE,Jav ...
- MySQL学习笔记-大纲
软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...
- ps教程分享:一定要记住这20种PS技术!
一定要记住这20种PS技术!会让你的照片美的不行! 一种简单的数码照片后期润饰 1)打开图片,执行色像/饱和度(-40)降低饱和度. 2)新建一图层,将图层模式改为柔光,用画笔工具将需要润饰的部分画几 ...
- MySQL中的联结表
使用联结能够实现用一条SELECT语句检索出存储在多个表中的数据.联结是一种机制,用来在一条SELECT语句中关联表,不是物理实体,其在实际的数据库表中并不存在,DBMS会根据需要建立联结,且会在查询 ...
- Linux安装及入门
Linux安装及学习 Linux遇到的问题: 在安装过程中因为代码输错(少空格)而质疑自己下载的ubuntu和virtualbox版本,于是卸载之后重新安装了一次,后来才发现是代码输错了(教程中的空格 ...
- Python之路(第九篇)Python文件操作
一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r",encoding = “utf ...
- Python之路番外(第三篇):Pycharm的使用秘籍
版本:Pycharm2017.3.4Professional Edition 一.Pycharm的基本使用1.在Pycharm下为你的python项目配置python解释器 file --settin ...
- Bootstrap学习遇到的role属性--- 无障碍网页应用属性
以前接触过Bootstrap,但也只是仅仅接触,现在重新学习下,今天看到一个例子中的属性有一个role, 查阅资料发现这个是--WAI-ARIA无障碍设计属性: 通俗说是该设计为了一些盲人,失聪,残疾 ...
- 【Web】Nginx Rewrite规则
Rewrite介绍 Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Ngi ...