SALVAR IMAGEM CAPTURADA POR WEBCAM BAIXA RESOLU?ÃO

FFECHER 12/01/2016 11:23:16
#456009
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

KURTGU 12/01/2016 11:27:44
#456011
Qual formato que esta salvando?
KURTGU 12/01/2016 11:32:07
#456012
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...

FFECHER 12/01/2016 11:32:51
#456013
FOTO.BMP
Utilizo o VB6... O que percebi também é que vez ou outra aparece um quadro verde com o mesmo tamanho 901kb.
Obrigado.
FFECHER 12/01/2016 11:36:25
#456016
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
KURTGU 12/01/2016 11:37:11
#456017
Fez a mudanca do formato diminuiu algo?
FFECHER 12/01/2016 14:08:34
#456028
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
KURTGU 12/01/2016 15:22:42
#456034
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..?
FFECHER 12/01/2016 16:11:09
#456040
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
KERPLUNK 13/01/2016 00:38:24
#456061
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.
DS2T 13/01/2016 06:05:31
#456063
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!
Tópico encerrado , respostas não são mais permitidas