Webcam

Iniciado por magarcan, 10 Septiembre 2007, 00:14 AM

0 Miembros y 2 Visitantes están viendo este tema.

magarcan

He encontrado un código en internet que me permite capturar el contenido de una webcam. El caso es que el video lo muestra en un PictureBox. El problema es que si capturo el video a 320x240 independientemente del tamaño del PictureBox el video se muestra a ese tamaño. ¿Conocéis alguna manera de redimensionarlo (vamos, hacerle un zoom)?
Gracias.

PD: os dejo el código de la captura por si os es útil.
'Declaraciones:
Const ws_visible = &H10000000
Const ws_child = &H40000000
Const WM_USER = 1024
Const WM_CAP_EDIT_COPY = WM_USER + 30
Const wm_cap_driver_connect = WM_USER + 10
Const wm_cap_set_preview = WM_USER + 50
Const wm_cap_set_overlay = WM_USER + 51
Const WM_CAP_SET_PREVIEWRATE = WM_USER + 52
Const WM_CAP_SEQUENCE = WM_USER + 62
Const WM_CAP_SINGLE_FRAME_OPEN = WM_USER + 70
Const WM_CAP_SINGLE_FRAME_CLOSE = WM_USER + 71
Const WM_CAP_SINGLE_FRAME = WM_USER + 72
Const DRV_USER = &H4000
Const DVM_DIALOG = DRV_USER + 100
Const PREVIEWRATE = 30

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal a As String, ByVal b As Long, ByVal c As Integer, ByVal d As Integer, ByVal e As Integer, ByVal f As Integer, ByVal g As Long, ByVal h As Integer) As Long

Dim hwndc As Long
'Declaro la función GetPixel
Private Declare Function GetPixel Lib "gdi32" ( _
    ByVal hdc As Long, _
    ByVal X As Long, _
    ByVal Y As Long) As Long

Private Sub Command1_Click()
'Código que realiza la captura de la imagen:

temp = SendMessage(hwndc, WM_CAP_EDIT_COPY, 1, 0)
Set Picture1.Picture = Clipboard.GetData
'Guardo la imagen para ver las dimensiones
SavePicture Picture1.Picture, "c:\imagen.jpg"

End Sub


Private Sub Form_Load()
'Código que activa la captura de imágenesse supone un formulario con 2 picture llamados "picture1" y "picture2")

hwndc = capCreateCaptureWindow("Ventana de Captura", ws_child Or ws_visible, 0, 0, Picture2.Width, Picture2.Height, Picture2.hwnd, 0)
If (hwndc <> 0) Then
temp = SendMessage(hwndc, wm_cap_driver_connect, 0, 0)
temp = SendMessage(hwndc, wm_cap_set_preview, 1, 0)
temp = SendMessage(hwndc, WM_CAP_SET_PREVIEWRATE, PREVIEWRATE, 0)
End If


End Sub

ranslsad

Si lo que quieres es que se ponga el picturebox al mismo tamaño que la foto, nose.. por eso yo uso un "Image" es el otro apra poner fotos..
:D
Espero que te haya servido la chapuzilla :P

Salu2

Ranslsad

magarcan

Ésto es una captura del programa. Lo que quiero hacer es que el video se me redimensione al tamaño del PictureBox

Arcangel

Cámbialo por un control image, con el picturebox no hay forma de hacerlo, lo que te tocaría seria diseñar alguna función que redimencione la imagen, lo que si puedes hacer es con la propiedad autosize hacer que el control se ponga del tamaño de la imagen pero no alrevez, ahora el control image tiene una opcion strech que sirve para hacer que imagenes mas grandes se pongan del tamaño del control, no tengo idea si sirve a la inversa xD capas si, sino como te dije, te tocaria hacer una funcion que se encargue de eso, muy posiblemente encuentres algún modulo por ahí que lo haga, busca en google.

Arcangel

LeandroA

hola como no se va a poder con el picture? mira solo tenes que pintarlo sobre el

Picture1.AutoRedraw = True
Picture1.PaintPicture Clipboard.GetData, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
Picture1.Refresh

Saludos

ranslsad

Cita de: Arcangel en 10 Septiembre 2007, 01:53 AM
Arcangel

La primera vez que te veo en el foro de programacion vb :P
Nose... as vuelto o algo o esque estas en otras secciones?
PD: perdon que no tiene nada que veer con el thread pero me entro la curiosidad :D

Salu2

Ranslsad

magarcan

#6
He puesto ésto y no lo hace.

Picture1.AutoRedraw = True
Picture1.PaintPicture Clipboard.GetData, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
Picture1.Refresh


De hecho ahora tengo un problema mçás grave. Ayer estuve probando algunos códigos de funciones con webcam en vb. Y resulta que ahora, al visualizarse la imagen va despacio, como a 4 frames por segundo. Me imagino que alguno de éstos programas me hayan cambiado la configuración del "WDM Image capture". ¿Alguno sabéis como poner la configuración por defecto?

EDITo: Ya he resuleto éste problema (el de los fps) el caso es que el programa que probé fijo los fps de captura a 8. Y el controlador de microsoft guarda la configuración, así que si no lo tocas te quedas con la última utilizada.
Gracias

ranslsad

Cita de: magarcan en 10 Septiembre 2007, 12:42 PM
He puesto ésto y no lo hace.

Picture1.AutoRedraw = True
Picture1.PaintPicture Clipboard.GetData, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
Picture1.Refresh


Lo dicho hazlo con un Image... no con in PictureBox..
Se pone al tamaño de la imagen enseguida :D

Salu2

Ranslsad

magarcan

Por lo visto el uso de ésta API en visual basic obliga a utilizar PIctureBox, ya que cambiándolos por ImageBox, dice que no reconoce nosequé.

Habrá que fastidiarse...Si alguien tiene alguna otra idea que lo diga.
Gracias

TUNOVATO

#9
'Obtiene frames , copia y adapta la escala a la ventana del picture1
    SendMessage hWndCap, GET_FRAME, 0, 0
    SendMessage hWndCap, COPY, 0, 0
    SendMessage hWndCap, SET_SCALE, True, 0 'esto es lo que necesitas pero busca la api conrrespondiente o equivalente