用AVICAP32.DLL实现的摄像头拍照,图像是翻转的怎么办?

比特灵 2017-11-22 02:23:33
从网上找的例子,可以拍照,但是图像是翻转的,就是左右对调了,感觉怪怪的,怎么处理?


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
hWndC: THandle;
public
{ Public declarations }
end;

var
Form1: TForm1;

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;
// www.delphitop.com

function capCreateCaptureWindowA(lpszWindowName: PCHAR; dwStyle: longint;
x: integer; y: integer; nWidth: integer; nHeight: integer; ParentWin: HWND;
nId: integer): HWND;

STDCALL EXTERNAL 'AVICAP32.DLL';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
// hWndC := capCreateCaptureWindowA('My Own Capture Window',WS_CHILD or WS_VISIBLE ,Panel1.Left,Panel1.Top,Panel1.Width,Panel1.Height,Form1.Handle,0);
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE, Panel1.Left, Panel1.Top, Panel1.Width,
Panel1.Height, Form1.Handle, 0);
if hWndC <> 0 then
begin
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);
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, longint(PCHAR('d:\test.bmp')));
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0,
longint(PCHAR('d:\test.avi')));
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
end;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_STOP, 0, 0);
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
end;
end;

end.
...全文
327 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2017-11-24
  • 打赏
  • 举报
回复
未用过AVICAP32.DLL,建议使用DSPack功能比较多,例子也多。
比特灵 2017-11-23
  • 打赏
  • 举报
回复
这个代码只能显示摄像头内容,无法抓图,谁能指点下,感谢感谢。。。
#region 导入API函数 [DllImport("avicap32.dll")]//包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动程序提供一个高级接口 public static extern IntPtr capCreateCaptureWindow(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hwndParent, int nID); /************参数说明************* * * 函数:capCreateCaptureWindow * * lpszWindowName:标识窗口的名称 * dwStyle:标识窗口风格 * x、y:标识窗口的左上角坐标 * nWidth、nHeight:标识窗口的宽度和高度 * hWnd:标识父窗口句柄 * nID:标识窗口ID * * 返回值:视频捕捉窗口句柄。 * ********************************/ [DllImport("AVICAP32.dll", CharSet = CharSet.Unicode)] public static extern bool capGetDriverDescription(int wDriverIndex, StringBuilder lpszName, int cbName, StringBuilder lpszVer, int cbVer); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref CAPDRIVERCAPS lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref CAPTUREPARMS lParam); [DllImport("User32.dll")] public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref CAPSTATUS lParam); [DllImport("User32.dll")] public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags); [DllImport("avicap32.dll")] public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize); #endregion

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧