FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Gestionar la Camara Web Usando AVICAP32.DLL
Hola Amigos...
Como he visto que hay varios temas donde preguntan como gestionar la camara Web y a pesar que existe un control llamado tsCap32 para Delphi, me he dado cuenta que este componente no se puede agregar a C++ Builder y menos si es Codegear, por tal razón decidi escribir una clase en C++ llamada WebCam que hereda de TPanel y gestiona la Camara Web. Para agregar el control a un formulario debe hacerce en tiempo de ejecucion con una instruccion new. Allí les dejo la clase y un ejemplo para que lo prueben. La idea de esto seria que siguieran agregando funcionalidad a la clase y tal vez crear un componente y publicarlo en sourceforge.net PD: Por cierto funciona tanto para Windows Xp como para Windows Vista y el proyecto fue desarrollado en CodeGear RAD Studio 2007, pero pueden agregarla facilmente a cualquier version de C++ Builder. Aquí dejo el código de la Clase webcam.h Código:
//--------------------------------------------------------------------------- #ifndef webcamH #define webcamH #include <vcl.h> #include <vfw.h> class WebCam : public TPanel{ HWND hWndCam; int device; bool grabbing; public: _fastcall WebCam(TComponent* Owner) : TPanel(Owner), hWndCam(0), device(0), grabbing(false) {}; _fastcall ~WebCam(){ closeVideoCam(); }; AnsiString __fastcall getDeviceName(int dev); bool __fastcall openVideoCam(int dev); bool __fastcall closeVideoCam(); bool __fastcall saveAsBMP(AnsiString fileName); bool __fastcall saveAsJPG(AnsiString fileName); bool __fastcall startCaptureAVI(AnsiString fileName); bool __fastcall stopCaptureAVI(); }; //--------------------------------------------------------------------------- #endif Código:
//--------------------------------------------------------------------------- #pragma hdrstop #include "webcam.h" #include <stdio.h> #include <jpeg.hpp> //--------------------------------------------------------------------------- #pragma package(smart_init) //////////////////////////////////////////////////////////////////////////////// //Retorna el nombre del dispositivo AnsiString __fastcall WebCam::getDeviceName(int dev){ char name[100], description[100]; bool result; result=capGetDriverDescriptionA(dev,name,100,description,100); if (!result) return AnsiString(""); return AnsiString(name)+AnsiString(description); } //////////////////////////////////////////////////////////////////////////////// //Abre la camara en modo de video bool __fastcall WebCam::openVideoCam(int dev){ if(!closeVideoCam()) return false; hWndCam = capCreateCaptureWindowA("My Own Capture Window", WS_CHILD | WS_VISIBLE , 0, 0, Width, Height, Handle, dev); if (hWndCam){ device = dev; SendMessage(hWndCam, WM_CAP_DRIVER_CONNECT, device, 0); SendMessage(hWndCam,WM_CAP_SET_PREVIEWRATE,30,0); SendMessage(hWndCam, WM_CAP_SET_PREVIEW,(WPARAM)true,0); capPreviewScale(hWndCam,true); return true; } return false; } //////////////////////////////////////////////////////////////////////////////// //Cierra la camara bool __fastcall WebCam::closeVideoCam(){ bool result = true; if(grabbing) stopCaptureAVI(); if (hWndCam){ result = SendMessage(hWndCam, WM_CAP_DRIVER_DISCONNECT, 0, 0); if(result){ hWndCam = 0; device = 0; grabbing = false; } } return result; } //////////////////////////////////////////////////////////////////////////////// //Salva un snapshot como BMP bool __fastcall WebCam::saveAsBMP(AnsiString fileName){ if (hWndCam){ fileName = ChangeFileExt(fileName, ".bmp"); return SendMessage(hWndCam, WM_CAP_FILE_SAVEDIB, 0, (long)fileName.c_str()); } return false; } //////////////////////////////////////////////////////////////////////////////// //Salva un snapshot en un formato especifico bool __fastcall WebCam::saveAsJPG(AnsiString fileName){ Graphics::TBitmap *pic; TJPEGImage *jpg; AnsiString tempFile; if (hWndCam){ tempFile = ExtractFilePath(fileName)+"\\image.bmp"; if(SendMessage(hWndCam, WM_CAP_FILE_SAVEDIB, 0, (long)tempFile.c_str())){ pic = new Graphics::TBitmap(); jpg = new TJPEGImage(); pic->LoadFromFile(tempFile); fileName = ChangeFileExt(fileName, ".jpg"); jpg->Assign(pic); jpg->SaveToFile(fileName); pic->Free(); jpg->Free(); remove(tempFile.c_str()); return true; } } return false; } //////////////////////////////////////////////////////////////////////////////// //Inicia la grabación de video en formato AVI bool __fastcall WebCam::startCaptureAVI(AnsiString fileName){ bool result = false; CAPTUREPARMS capParams; if(grabbing) stopCaptureAVI(); if (hWndCam){ result = SendMessage(hWndCam, WM_CAP_FILE_SET_CAPTURE_FILE, 0, (long)fileName.c_str()); if(result){ capCaptureGetSetup(hWndCam,&capParams, sizeof(CAPTUREPARMS)); capParams.fYield = true; capParams.fAbortLeftMouse = false; capParams.fAbortRightMouse = true; capCaptureSetSetup(hWndCam,&capParams, sizeof(CAPTUREPARMS)); result = SendMessage(hWndCam, WM_CAP_SEQUENCE, 0, 0); } } grabbing = result; return result; } //////////////////////////////////////////////////////////////////////////////// //Detiene la grabación de video bool __fastcall WebCam::stopCaptureAVI(){ bool result = false; if (hWndCam && grabbing) { result = SendMessage(hWndCam, WM_CAP_STOP, 0, 0); if(result) grabbing = false; } return result; } [HTML] <div style="padding:6px"> <fieldset class="fieldset"> <legend>Archivos Adjuntos</legend> <table cellpadding="0" cellspacing="3" border="0"> <tr> <td><img class="inlineimg" src="images/attach/zip.gif" alt="Tipo de Archivo: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td> <td><a href="attachment.php?attachmentid=1344&d=1219525186">WebCam.zip</a> (8,8 KB, 4 visitas)</td> </tr> </table> </fieldset> </div> [/HTML] |
|
|
|