写了一个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 + 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();
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, //窗口样式
    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.
时间: 2024-09-29 16:22:03

写了一个DELPHI操作USB摄像头类分享给大家的相关文章

C#.NET 程序员的福利,自己写的一个XML操作类,可实现像jquery一样方便的xml操作,且不用专门去处理命名空间。

此工具是进入一家新公司之后实现的,主要是工作当中操作 xml 的时间太多,因为公司按任务计“工作量”,领导给我安排的时间远远不够完善此工具[悲哀的制度],虽然我也能直接在cs中直接中规中矩完成,但实在受不了那种重复和低效,所以此工具基础部分绝大部分时间是在家中加班完成,剩下应用于公司项目中之后,在公司改了一些BUG,差不多也用了半年多了,实在是很好用,现在也差不多稳定了,特分享出来,需要的直接拿去用吧,有BUG可以直接发消息给我沟通,不用谢.. 使用方法: x(filepath).Find("/

使用Apache POI写的一个生成Excel的工具类

话不多说,直接上代码,就一个类,注释也写得比较清楚了. /** * */ package com.common.office; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.util.Calendar; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apach

自己写的一个读取execl的帮助类

目标:读取execl的第一个sheet,并传入不需要读取的表头的行数,返回该execl里所有数据的list 解析共有2种:1.DOM      2.SAX 1 import java.io.File; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.text.DecimalFormat; 5 import java.util.ArrayList; 6 import java.util.Iterat

一个漂亮的php验证码类(分享)

直接上代码: //验证码类 class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 private $width = 130;//宽度 private $height = 50;//高度 private $img;//图形资源句柄 private $font

一个经典的PHP验证码类分享

我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现 的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度.高度及验证码字母个数,就可以成功创建一个验证码类的对象. 该类的声明代码如下所示: <?php class Vcode { private $width; //宽 private $height; //高 private $num; //数量 private $co

java操作Excel工具类分享

import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import org.apache.poi.hssf.usermodel.HS

安卓 USB摄像头 开源库 UVCCamera 教程

https://github.com/saki4510t/UVCCamera UVCCamera 听名字就知道使用UVC( USB VEDIO CLASS) 协议的通用类库.linux原生支持,基本支持市面上所有免区USB摄像头. 此开源库包含JNI及android封装的类库.是目前最好用的安卓USB摄像头类库. UVCCamera来控制.管理与外接设备的连接,UVCCamera.setFrameCallback(final IFrameCallback callback, final int

poi操作Excel工具类

在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.写入Excel.合并Excel的功能.

一个漂亮的php验证码类

一个漂亮的php验证码类(分享) 作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下 直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 pri