SALVAR IMAGEM CAPTURADA POR WEBCAM BAIXA RESOLU?ÃO
Pessoal... bom dia.
Estou usando a avicap32.dll para salvar imagens 3 x 4 de uma webcam.
O problema é que a imagem chega com 900kb e o ideal seria abaixo de 40 kb.
Alguém tem uma solução mais ajustada.
Obrigado.
FFECHER
rotina usada:
Private Declare Function capCreateCaptureWindow Lib [Ô]avicap32.dll[Ô] Alias [Ô]capCreateCaptureWindowA[Ô] (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private Declare Function SendMessage Lib [Ô]User32[Ô] Alias [Ô]SendMessageA[Ô] (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function ReleaseCapture Lib [Ô]User32[Ô] () As Long
Private Const WM_CAP_DRIVER_CONNECT As Long = 1034
Private Const WM_CAP_DRIVER_DISCONNECT As Long = 1035
Private Const WM_CAP_GRAB_FRAME As Long = 1084
Private Const WM_CAP_EDIT_COPY As Long = 1054
Private Const WM_CAP_DLG_VIDEOFORMAT As Long = 1065
Private Const WM_CAP_DLG_VIDEOSOURCE As Long = 1066
Private Const WM_CLOSE = &H10
Private mCapHwnd As Long
----------------
Public Sub cmdIniciaWebCam()
mCapHwnd = capCreateCaptureWindow([Ô]My Own Capture Window[Ô], 0, 0, 0, 320, 240, fSocios.hWnd, 0) [ô][ô][ô] tentei baixar 320 x 240... não funciona
SendMessage mCapHwnd, WM_CAP_DRIVER_CONNECT, 0, 0
End Sub
--------------------
Public Function cmdCapturaImagem() As Boolean
Clipboard.Clear
SendMessage mCapHwnd, WM_CAP_GRAB_FRAME, 0, 0
SendMessage mCapHwnd, WM_CAP_EDIT_COPY, 0, 0
If Clipboard.GetFormat(10) Then
End If
fSocios.foto.Picture = Clipboard.GetData
strCaminho = DirTrab & [Ô]\imagens\FOTO.bmp[Ô]
SavePicture fSocios.foto.Picture, strCaminho
cmdEncerraWebCam
End Function
-----------------------------
Public Sub cmdEncerraWebCam()
SendMessage mCapHwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0
End Sub
Estou usando a avicap32.dll para salvar imagens 3 x 4 de uma webcam.
O problema é que a imagem chega com 900kb e o ideal seria abaixo de 40 kb.
Alguém tem uma solução mais ajustada.
Obrigado.
FFECHER
rotina usada:
Private Declare Function capCreateCaptureWindow Lib [Ô]avicap32.dll[Ô] Alias [Ô]capCreateCaptureWindowA[Ô] (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private Declare Function SendMessage Lib [Ô]User32[Ô] Alias [Ô]SendMessageA[Ô] (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function ReleaseCapture Lib [Ô]User32[Ô] () As Long
Private Const WM_CAP_DRIVER_CONNECT As Long = 1034
Private Const WM_CAP_DRIVER_DISCONNECT As Long = 1035
Private Const WM_CAP_GRAB_FRAME As Long = 1084
Private Const WM_CAP_EDIT_COPY As Long = 1054
Private Const WM_CAP_DLG_VIDEOFORMAT As Long = 1065
Private Const WM_CAP_DLG_VIDEOSOURCE As Long = 1066
Private Const WM_CLOSE = &H10
Private mCapHwnd As Long
----------------
Public Sub cmdIniciaWebCam()
mCapHwnd = capCreateCaptureWindow([Ô]My Own Capture Window[Ô], 0, 0, 0, 320, 240, fSocios.hWnd, 0) [ô][ô][ô] tentei baixar 320 x 240... não funciona
SendMessage mCapHwnd, WM_CAP_DRIVER_CONNECT, 0, 0
End Sub
--------------------
Public Function cmdCapturaImagem() As Boolean
Clipboard.Clear
SendMessage mCapHwnd, WM_CAP_GRAB_FRAME, 0, 0
SendMessage mCapHwnd, WM_CAP_EDIT_COPY, 0, 0
If Clipboard.GetFormat(10) Then
End If
fSocios.foto.Picture = Clipboard.GetData
strCaminho = DirTrab & [Ô]\imagens\FOTO.bmp[Ô]
SavePicture fSocios.foto.Picture, strCaminho
cmdEncerraWebCam
End Function
-----------------------------
Public Sub cmdEncerraWebCam()
SendMessage mCapHwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0
End Sub
Qual formato que esta salvando?
Desculpe vi agora no seu codigo que esta salvando em BMP o problema nao e a resolucao e sim o formato olhe abaixo ou acima kkkk na foto pra voce ver a mesma foto em formatos diferentes...mude para salvar em jpg e veja se diminui...
FOTO.BMP
Utilizo o VB6... O que percebi também é que vez ou outra aparece um quadro verde com o mesmo tamanho 901kb.
Obrigado.
Utilizo o VB6... O que percebi também é que vez ou outra aparece um quadro verde com o mesmo tamanho 901kb.
Obrigado.
Caro KurtGu:
Rodando um programa da própria câmera ele grava o mesmo BMP com tamanho 50kb... penso que a dll que estou usando poderia receber uma resolução mais baixa.
Outro aspecto que poderÃamos considerar seria salvar aquela área da tela onde a imagem está locada... é possÃvel fazer isso?
Obrigado.
FFecher
Rodando um programa da própria câmera ele grava o mesmo BMP com tamanho 50kb... penso que a dll que estou usando poderia receber uma resolução mais baixa.
Outro aspecto que poderÃamos considerar seria salvar aquela área da tela onde a imagem está locada... é possÃvel fazer isso?
Obrigado.
FFecher
Fez a mudanca do formato diminuiu algo?
Como a captura da imagem é feita via código, não tem com alterar o formato. Mesmo assim não chegaria aos 40Kb que preciso.
Obrigado.
FFecher
Obrigado.
FFecher
Por que voce simplesmente nao altera esta linha do seu codigo?
[txt-color=#e80000]strCaminho = DirTrab & [Ô]\imagens\FOTO.bmp[Ô][/txt-color] para o formato que voce precisa..?
[txt-color=#e80000]strCaminho = DirTrab & [Ô]\imagens\FOTO.bmp[Ô][/txt-color] para o formato que voce precisa..?
Caro Kurtgu
A linha onde ele grava não é o problema... o problema é o tamanho... ele devolve 901kb...
Queria descobrir uma maneira para baixar a definição para uns 40kb...
Obrigado
FFecher
A linha onde ele grava não é o problema... o problema é o tamanho... ele devolve 901kb...
Queria descobrir uma maneira para baixar a definição para uns 40kb...
Obrigado
FFecher
O salvamento da imagem capturada em si, é o comando SavePicture. Ele grava SOMENTE bmp, ou seja, não adianta mudar a extensão do nome do arquivo. Você teria que usar todo um aparato pra isso, um exemplo nesse link. Mas já adianto, não é muito simples.
Se quando você salva com o programa da webcam ele te retorna um tamanho pequeno para o formato bmp, e usando esse código ele retorna o mesmo bmp muito maior. Só pode ser uma coisa:
O programa usa compressão de dados com perda para diminuir a qualidade da imagem, e logo em seguida usa a codificação bmp.
Você terá que simular o mesmo no seu projeto. Talvez usando aquele projeto do Kerplunk, para codificar para jpg.
Importante lembrar que compressão de imagens é um pé no saco. Esses algoritmos geralmente usam uma série de compressões, desde algoritmo de Huffman, até Transformada Discreta do Cosseno. é algo extremamente trabalho que não vale a pena fazer na unha, a não ser que seja para aprendizado.
Em VB6 talvez seja mais complicado lidar com isso, mas no VB.NET seria bem mais fácil. Sugiro que dê uma olhada nesse projeto do Kerplunk. Caso a imagem ainda não fique do tamanho que deseja, pode fazer uma gambiarra criando um pequeno algoritmo que transforme as colorações próximas, na média das mesmas.
Exemplo: Considerar RGB (255,255,255) = (255,254,254). Você vai perder qualidade também, mas na hora de aplicar a compressão, o resultado vai ser bem mais satisfatório.
Assunto interessante esse de compressão de dados... já perdi bastante tempo da minha vida tentando criar algo novo, mas sempre acabo caindo em algoritmos já existentes hehehehe Escrevi um artigo sobre isso uma vez, depois vou postar aqui no VbMania.
Abraços!
O programa usa compressão de dados com perda para diminuir a qualidade da imagem, e logo em seguida usa a codificação bmp.
Você terá que simular o mesmo no seu projeto. Talvez usando aquele projeto do Kerplunk, para codificar para jpg.
Importante lembrar que compressão de imagens é um pé no saco. Esses algoritmos geralmente usam uma série de compressões, desde algoritmo de Huffman, até Transformada Discreta do Cosseno. é algo extremamente trabalho que não vale a pena fazer na unha, a não ser que seja para aprendizado.
Em VB6 talvez seja mais complicado lidar com isso, mas no VB.NET seria bem mais fácil. Sugiro que dê uma olhada nesse projeto do Kerplunk. Caso a imagem ainda não fique do tamanho que deseja, pode fazer uma gambiarra criando um pequeno algoritmo que transforme as colorações próximas, na média das mesmas.
Exemplo: Considerar RGB (255,255,255) = (255,254,254). Você vai perder qualidade também, mas na hora de aplicar a compressão, o resultado vai ser bem mais satisfatório.
Assunto interessante esse de compressão de dados... já perdi bastante tempo da minha vida tentando criar algo novo, mas sempre acabo caindo em algoritmos já existentes hehehehe Escrevi um artigo sobre isso uma vez, depois vou postar aqui no VbMania.
Abraços!
Tópico encerrado , respostas não são mais permitidas