Skip to content
16 de maio de 2012 / rafaelti

Capturar video de uma webcam no PowerBuilder

Objetivo

Capturar video de uma webcam no PowerBuilder através de API do windows usando capCreateCaptureWindowA da dll AVICAP32.

Plataforma

Windows e PowerBuilder

Conhecimento

Windows e PowerBuilder

Introdução

Em em alguns momentos não há tempo hábil para pegar uma imagem ou capturar uma imagem salvar no disco e depois salvar no sistema, principalmente se o usuário final for leigo, então faz-se importante o sistema gerencia  a captura e questões básicas de edição.

Solução

Nessa solução utilizarei a própria API do Windows para fazer a captura da imagem, com isso, este exemplo pode ser convertido para a maioria das linguagens.

O User Object deve chamar-se uo_custom.

$PBExportHeader$uo_custom.sru
forward
global type uo_custom from userobject
end type
type cb_3 from commandbutton within uo_custom
end type
type cb_2 from commandbutton within uo_custom
end type
type cb_1 from commandbutton within uo_custom
end type
type st_1 from statictext within uo_custom
end type
type p_1 from picture within uo_custom
end type
end forward

global type uo_custom from userobject
integer width = 2939
integer height = 1400
long backcolor = 67108864
string text = "none"
long tabtextcolor = 33554432
long picturemaskcolor = 536870912
cb_3 cb_3
cb_2 cb_2
cb_1 cb_1
st_1 st_1
p_1 p_1
end type
global uo_custom uo_custom

type prototypes
function ulong capCreateCaptureWindowA(string lpszWindowName,ulong dwStyle,long li_x ,long li_y ,long nWidth ,long nHeight ,ulong ParentWin ,long nId ) LIBRARY 'AVICAP32.DLL'
end prototypes

type variables
Private:
uint lhand
Constant long WM_USER=1024
Constant long WM_CAP_START = WM_USER
Constant long WM_CAP_STOP = WM_CAP_START + 68
Constant long WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Constant long WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Constant long WM_CAP_SAVEDIB = WM_CAP_START + 25
Constant long WM_CAP_GRAB_FRAME = WM_CAP_START + 60
Constant long WM_CAP_SEQUENCE = WM_CAP_START + 62
Constant long WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
Constant long WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63
Constant long WM_CAP_SET_OVERLAY =WM_CAP_START+ 51
Constant long WM_CAP_SET_PREVIEW =WM_CAP_START+ 50
Constant long WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6
Constant long WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2
Constant long WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3
Constant long WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5
Constant long WM_CAP_SET_SCALE=WM_CAP_START+ 53
Constant long WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52
end variables

on uo_custom.create
this.cb_3=create cb_3
this.cb_2=create cb_2
this.cb_1=create cb_1
this.st_1=create st_1
this.p_1=create p_1
this.Control[]={this.cb_3,&
this.cb_2,&
this.cb_1,&
this.st_1,&
this.p_1}
end on

on uo_custom.destroy
destroy(this.cb_3)
destroy(this.cb_2)
destroy(this.cb_1)
destroy(this.st_1)
destroy(this.p_1)
end on

event destructor;if lhand <> 0 then
 send(lhand, WM_CAP_DRIVER_DISCONNECT, 0, 0)
 lhand =0
end if
end event

type cb_3 from commandbutton within uo_custom
integer x = 430
integer y = 1252
integer width = 325
integer height = 100
integer taborder = 90
integer textsize = -9
fontcharset fontcharset = gb2312charset!
fontpitch fontpitch = variable!
string facename = "??"
string text = "?????"
end type

event clicked;send(lhand, WM_CAP_DRIVER_DISCONNECT, 0, 0)
lhand =0
cb_1.enabled = true
end event

type cb_2 from commandbutton within uo_custom
integer x = 782
integer y = 1252
integer width = 325
integer height = 100
integer taborder = 80
integer textsize = -9
fontcharset fontcharset = gb2312charset!
fontpitch fontpitch = variable!
string facename = "teste1"
string text = "teste2"
end type

event clicked;string s_map
s_map='C:\save.bmp'
if lhand <> 0 then
 if FileExists(s_map) then FileDelete(s_map)
 Send(lhand,WM_CAP_SAVEDIB,0,s_map);
 p_1.picturename = s_map
 send(lhand, WM_CAP_DRIVER_DISCONNECT, 0, 0)
 lhand =0
 messagebox('teste','teste'+s_map)
else
 messagebox('teste','teste2')
end if

end event

type cb_1 from commandbutton within uo_custom
integer x = 78
integer y = 1252
integer width = 325
integer height = 100
integer taborder = 70
integer textsize = -9
fontcharset fontcharset = gb2312charset!
fontpitch fontpitch = variable!
string facename = "tese"
string text = "teste3"
end type

event clicked;string lpszName,s
ulong l1
setpointer(hourglass!)
l1=handle(st_1)
lpszName='teste'
lhand=capCreateCaptureWindowA(lpszName,262144+12582912+1073741824 + 268435456,0,0,UnitsToPixels(st_1.width,XUnitsToPixels!),UnitsToPixels(st_1.height,YUnitsToPixels!),l1,0)
if lhand <> 0 then
 send(lhand, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
 send(lhand, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
 send(lhand, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
 send(lhand, WM_CAP_DRIVER_CONNECT, 0, 0)
 send(lhand, WM_CAP_SET_SCALE, 1, 0)
 send(lhand, WM_CAP_SET_PREVIEWRATE, 66, 0)
 send(lhand, WM_CAP_SET_OVERLAY, 1, 0)
 send(lhand, WM_CAP_SET_PREVIEW, 1, 0)
 cb_2.enabled = true
 this.enabled = false
end if
setpointer(arrow!)

&nbsp;

end event

type st_1 from statictext within uo_custom
integer x = 18
integer y = 12
integer width = 1435
integer height = 1184
integer textsize = -9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long textcolor = 33554432
long backcolor = 67108864
boolean enabled = false
alignment alignment = center!
boolean border = true
boolean focusrectangle = false
end type

type p_1 from picture within uo_custom
integer x = 1472
integer y = 12
integer width = 1435
integer height = 1184
boolean enabled = false
boolean originalsize = true
boolean border = true
boolean focusrectangle = false
end type
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: