FoxPro/Visual FoxPro - Tomar fotos desde el formulario

 
Vista:
sin imagen de perfil

Tomar fotos desde el formulario

Publicado por Jesus Enrique Rivera (1 intervención) el 15/07/2006 18:33:16
Hola compañeros:

Tengo un proyecto en donde necesito que el cliente tome fotos directamente desde el formulario. Que al hacer clic en un boton se tome la foto desde la camara y se muestre en el formulario.

Podria ayudarme alguien?

De antemano le agradesco la ayuda. Gracias

Jesus Enrique Rivera Galindo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Tomar fotos desde el formulario

Publicado por Martín (19 intervenciones) el 01/08/2006 20:15:29
Ufff... ese era todo un tema, pero justamente HOY lo acabo de solucionar, así que espero que te sirva mi ayuda.

Como primera cosa, debés bajarte esta OCX. Es una OCX pública que el autor puso a disposición para manejar la webcam: http://www.shrinkwrapvb.com/ezvidcap.htm

La versión que tenés que bajar es la correspondiente a Visual Basic 6 (VB6)

Una vez bajada, deberás registrarla. El procedimiento es:

Inicio->Ejecutar:

c:\Directorio_de_Windows\Directorio_system\regsvr32.exe Directorio_de_la_OCX\ezVidC60.ocx

Una vez que ya disponés de la OCX registrada, acá tenés el código fuente para hacer andar la captura de fotos:

LOCAL oForm
oForm = CREATEOBJECT("Tform")
oForm.Show(1)
* end of main

DEFINE CLASS Tform As Form
#DEFINE WM_CAP_START 0x0400
#DEFINE WM_CAP_DRIVER_CONNECT (WM_CAP_START+10)
#DEFINE WM_CAP_DRIVER_DISCONNECT (WM_CAP_START+11)
#DEFINE WM_CAP_DRIVER_GET_CAPS (WM_CAP_START+14)
#DEFINE WM_CAP_SET_PREVIEW (WM_CAP_START+50)
#DEFINE WM_CAP_SET_OVERLAY (WM_CAP_START+51)
#DEFINE WM_CAP_SET_PREVIEWRATE (WM_CAP_START+52)
#DEFINE WM_CAP_GET_STATUS (WM_CAP_START+54)
#DEFINE WM_CAP_GRAB_FRAME (WM_CAP_START+60)

Width=340
Height=310
Autocenter=.T.
Caption="Using Video Capture"
MinButton=.F.
MaxButton=.F.
hWindow=0
hCapture=0
capWidth=0
capHeight=0
capOverlay=0

ADD OBJECT cmdGetFrame As CommandButton WITH Default=.T.,;
Left=15, Top=264, Height=27, Width=90, Caption="Get Frame",;
Enabled=.F.

ADD OBJECT cmdPreview As CommandButton WITH Default=.T.,;
Left=106, Top=264, Height=27, Width=100, Caption="Preview Video",;
Enabled=.F.

ADD OBJECT cmdClose As CommandButton WITH Cancel=.T.,;
Left=250, Top=264, Height=27, Width=70, Caption="Close"

PROCEDURE Activate
IF THIS.hWindow = 0
DECLARE INTEGER GetFocus IN user32
THIS.hWindow = GetFocus()
THIS.CreateCaptureWindow
THIS.DriverConnect
ENDIF

PROCEDURE Destroy
THIS.ReleaseCaptureWindow

PROCEDURE cmdClose.Click
ThisForm.Release

PROCEDURE cmdGetFrame.Click
ThisForm.GetFrame

PROCEDURE cmdPreview.Click
ThisForm.StartPreview

PROCEDURE GetFrame
#DEFINE WM_CAP_FILE_SAVEDIB (WM_CAP_START + 25)

LOCAL lcFile
lcFile = "" && File name to create
lcFile = "c:\temp\sample.bmp"

THIS.msg(WM_CAP_GRAB_FRAME, 0,0)
THIS.msg(WM_CAP_FILE_SAVEDIB, 0, lcFile,1)

PROCEDURE CreateCaptureWindow
#DEFINE WS_CHILD 0x40000000
#DEFINE WS_VISIBLE 0x10000000

DECLARE INTEGER capCreateCaptureWindow IN avicap32;
STRING lpszWindowName, LONG dwStyle,;
INTEGER x, INTEGER y,;
INTEGER nWidth, INTEGER nHeight,;
INTEGER hParent, INTEGER nID

THIS.hCapture = capCreateCaptureWindow("",;
WS_CHILD+WS_VISIBLE,;
10,8,320,240, THIS.hWindow, 1)

PROCEDURE DriverConnect
THIS.msg(WM_CAP_DRIVER_CONNECT, 0,0)
IF THIS.IsCaptureConnected()
THIS.GetCaptureDimensions
STORE .T. TO THIS.cmdGetFrame.Enabled,;
THIS.cmdPreview.Enabled
THIS.Caption = THIS.Caption + ": connected, " +;
LTRIM(STR(THIS.capWidth)) + "x" +;
LTRIM(STR(THIS.capHeight))
ELSE
THIS.Caption = THIS.Caption + ": failed to connect"
ENDIF

PROCEDURE DriverDisconnect
THIS.msg(WM_CAP_DRIVER_DISCONNECT, 0,0)

PROCEDURE ReleaseCaptureWindow
IF THIS.hCapture <> 0
THIS.DriverDisconnect
DECLARE INTEGER DestroyWindow IN user32 INTEGER hWnd
= DestroyWindow(THIS.hCapture)
THIS.hCapture = 0
ENDIF

PROCEDURE msg(msg, wParam, lParam, nMode)
IF THIS.hCapture = 0
RETURN
ENDIF

IF VARTYPE(nMode) <> "N" Or nMode=0
DECLARE INTEGER SendMessage IN user32;
INTEGER hWnd, INTEGER Msg,;
INTEGER wParam, INTEGER lParam
= SendMessage(THIS.hCapture, msg, wParam, lParam)
ELSE
DECLARE INTEGER SendMessage IN user32;
INTEGER hWnd, INTEGER Msg,;
INTEGER wParam, STRING @lParam
= SendMessage(THIS.hCapture, msg, wParam, @lParam)
ENDIF

FUNCTION IsCaptureConnected
* analyzing fCaptureInitialized member of the CAPDRIVERCAPS structure
#DEFINE CAPDRIVERCAPS_SIZE 44
LOCAL cBuffer, nResult
cBuffer = Repli(Chr(0),CAPDRIVERCAPS_SIZE)
THIS.msg(WM_CAP_DRIVER_GET_CAPS, Len(cBuffer), @cBuffer, 1)
THIS.capOverlay = buf2dword(SUBSTR(cBuffer,5,4))
nResult = Asc(SUBSTR(cBuffer, 21,1))
RETURN (nResult<>0)

PROCEDURE GetCaptureDimensions
* reading uiImageWidth and uiImageHeight members
* of the CAPSTATUS structure
#DEFINE CAPSTATUS_SIZE 76
LOCAL cBuffer
cBuffer = Repli(Chr(0), CAPSTATUS_SIZE)
THIS.msg(WM_CAP_GET_STATUS, Len(cBuffer), @cBuffer, 1)
THIS.capWidth = buf2dword(SUBSTR(cBuffer,1,4))
THIS.capHeight = buf2dword(SUBSTR(cBuffer,5,4))

PROCEDURE StartPreview
THIS.msg(WM_CAP_SET_PREVIEWRATE, 30,0)
THIS.msg(WM_CAP_SET_PREVIEW, 1,0)
IF THIS.capOverlay <> 0
THIS.msg(WM_CAP_SET_OVERLAY, 1,0)
ENDIF

PROCEDURE StopPreview
THIS.msg(WM_CAP_SET_PREVIEW, 0,0)
ENDDEFINE

FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +;
BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)

Fijate que en el procedimiento GetFrame, aparece una variable lcFile como la que contiene el archivo que te genera el bitmap. En lo particular, yo invoco a este procedimiento con un parámetro (que deberías ponerle al principio). Ese parámetro es el ID del registro, con el cual me aseguro tener un nombre único para los archivos de fotos. Y con eso estaría, justamente ahora estoy viendo cómo almacenar ese archivo en un campo general, para eso entré al foro y me encontré con tu consulta. Espero haberte servido de utilidad.

Este código fuente estaba en http://fox.wikis.com/wc.dll?Wiki~VideoCaptureApi~VFP así que le doy créditos a quien lo realizó. Espero, por lo menos, haberte subsanado todo el tiempo de búsqueda en la web que tuve yo ayer para encontrar ésto. :-D

Abrazos, Martín Lezama.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tomar fotos desde el formulario

Publicado por NAVI (2 intervenciones) el 19/09/2006 23:38:10
Este código funciona muy bien y todo, pero nesecito saber como hago esto en vb.net pues pongo la ocx que dice que hay que descargar y luego la monto en .net y me muestra la vista previa (en el diseño), pero cuando lo ejecuto no sale nada.
La cosa es que no nesecito todo ese código para tomar foto desde fox, en modo de diseño no sale la vista previa pero cuando lo ejecuto si funciona de maravilla (lo contrario de .net), como hago para que me funcione alla?

Gracias: IVAN DARIO GAITAN SANCHEZ (Neiva, Huila,Colombia).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tomar fotos desde el formulario

Publicado por NAVI (2 intervenciones) el 19/09/2006 23:42:14
Este código funciona muy bien y todo, pero nesecito saber como hago esto en vb.net pues pongo la ocx que dice que hay que descargar y luego la monto en .net y me muestra la vista previa (en el diseño), pero cuando lo ejecuto no sale nada.
La cosa es que no nesecito todo ese código para tomar foto desde fox, en modo de diseño no sale la vista previa pero cuando lo ejecuto si funciona de maravilla (lo contrario de .net), como hago para que me funcione alla?

Gracias: IVAN DARIO GAITAN SANCHEZ (Neiva, Huila,Colombia).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Tomar fotos desde el formulario

Publicado por Salvador Tovar (1 intervención) el 22/08/2007 23:27:45
Hola, de verdad corre muy bien, pero serias tan amable de indicarme como se hace para que la imagen sea una foto tamaño carnet o cual es la propiedad para cambiarle la dimension de la foto.
Agradeciso de antemano, saludos y que estes bienq
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tomar fotos desde el formulario

Publicado por Raul (2 intervenciones) el 07/09/2010 22:16:11
El codigo esta bien, lo estoy utilizando, pero tengo un pequeño detalle, me estan pidiendo que las fotos sean tomadas a una resolucion de 1000x1000, estuve revisando y solo me acepta 640x480, no se puede tomar fotos mas alla de esa resolcion, sin embargo con la utilidad de la camara si me permite tomar fotos hasta de 3200x2400.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Tomar fotos desde el formulario

Publicado por Jesús Olmos (2 intervenciones) el 29/01/2012 02:54:11
Buenas tardes.... tu codigo es fantastico... y de hecho me funciona en todos los equipos que he probado, menos en el de mi cliente justamente... que no hay forma de que se le activa la cam para hacer la foto..
Tiene los activex descargados, colcoados en system32, system. y la carpeta del programa.,.. las he registrado por regsvr32, pero no hay forma.....
Ellos trabajan con citrix... ?Alguna idea???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tomar fotos desde el formulario

Publicado por jesus (1 intervención) el 10/02/2014 15:48:55
Hola amigo, veo que tuviste problemas con el código de la cam.

Resulta que a mi no me toma fotos a pesar de tener instalada y funcionando la cam.

No se activan los botones para tomar la foto

Podríaas ayudarme ?

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar