Um exemplo simples que captura a imagem da Webcam e salva em uma pasta no Servidor. Este exemplo utiliza a classe ImageSnapshot para capturar uma imagem baseado em um objeto. Ele esta gerando um JPG com 85% de qualidade, configurada em new JPEGEncoder( 85 ). Você também poderá usar a classe PNGEncoder() se quiser salvar em PNG.

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               backgroundColor="#f6f6f6"
               creationComplete="application1_creationCompleteHandler(event)"
               viewSourceURL="231/index.html">
    
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.FlexEvent;
            import mx.graphics.ImageSnapshot;
            import mx.graphics.codec.JPEGEncoder;
            
            private var imagemBase64:String

            
            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                var camera:Camera=Camera.getCamera();
                camera.setMode( 320, 240, 10 );
                webcam.attachCamera( camera );
            }
            
            private function capturarImagem():void
            {
                // JPEGEncoder você configura a qualidade do JPEG No caso esta 85%
                var imagemWebcam:ImageSnapshot=ImageSnapshot.captureImage( webcam, 0, new JPEGEncoder( 85 ));
                imagemBase64=ImageSnapshot.encodeImageAsBase64( imagemWebcam );
                imgWebcam.source=imagemWebcam.data
                btSalvar.enabled=true;
            }
            
            protected function salvar():void
            {
                var loader:URLLoader = new URLLoader();
                loader.addEventListener(Event.COMPLETE, loader_completeHandler);
                
                var variables:URLVariables = new URLVariables();
                variables.imagem = imagemBase64;
                
                var request:URLRequest = new URLRequest();
                request.method = URLRequestMethod.POST;
                request.data = variables;
                request.url = "/code/231/recebeImagem.php";
                
                loader.load( request );
            }
            
            private function loader_completeHandler( event:Event ):void
            {
                var resposta:String = (event.currentTarget as URLLoader).data;
                
                if ( resposta == 'erro' )
                    Alert.show( "Erro ao salvar imagem", "Erro" );
                else
                    link.text = "http://flex.eduardokraus.com/code/231/" + resposta 
            }
            
            protected function btVisualizar_clickHandler(event:MouseEvent):void
            {
                capturarImagem();
            }
            
            protected function btSalvarDireto_clickHandler(event:MouseEvent):void
            {
                capturarImagem();
                salvar();
            }
            
            protected function btSalvar_clickHandler(event:MouseEvent):void
            {
                salvar()
            }
            
            
            protected function link_clickHandler(event:MouseEvent):void
            {
                navigateToURL( new URLRequest( link.text ));
            }
            
        ]]>
    </fx:Script>
    <!-- Texto Superior -->
    <s:Label x="10"
              y="10"
              fontSize="20"
              fontWeight="bold"
              text="Capturar imagem da WebCam e salvar com PHP"/>
    <!-- Barra Horizontal -->
    <mx:HRule x="10" y="49" width="690"/>
    
    <mx:VideoDisplay id="webcam"
                     x="10"
                     y="59"
                     width="320"
                     height="240"/>
    <s:Image id="imgWebcam"
              x="338"
              y="59"
              width="320"
              height="240"/>
    <mx:Button id="btVisualizar"
               x="10"
               y="307"
               label="Pré Visualizar"
               click="btVisualizar_clickHandler(event)"/>
    <mx:Button id="btSalvarDireto"
               x="122"
               y="307"
               label="Visualizar e Salvar"
               click="btSalvarDireto_clickHandler(event)"/>
    <mx:Button id="btSalvar"
               x="338"
               y="307"
               label="Salvar no servidor"
               enabled="false"
               click="btSalvar_clickHandler(event)"/>
    <s:Label x="10" 
             y="338" 
             color="#0048FF" 
             textDecoration="underline"
             id="link"
             click="link_clickHandler(event)"
             useHandCursor="true"/>
</s:Application>

Veja como ficará este exemplo compilado.

Source aqui.

new JPEGEncoder( 100 )

 

Gostou? Não esqueça de curtir!

Ou compartilhe o link com seus amigos

Compartilhar no Facebook Compartilhar no Google + Compartilhar no Twitter Compartilhar no LinkedIn

82 comentários

  1. [...] import mx.controls.Alert; import flash.net.navigateToURL; import mx.rpc.events.ResultEvent; Leia mais no post do autor...  Veja o post original no blog do autor [...]

  2. Felipe

    Esta dando esse erro na minha tentativa de aplicar.
    http://felipebusiness.hostmach.com.br/php/[object%20Object]

    Seu swf de exemplo não esta carregando aqui acima.

  3. Corintho Fernandes

    Desculpe a pergunta, mas como faço pra colocar isso em swf? Tenho q usar o adobe flash ou o teria q usar outra ferramenta para a tecnologia "flex"? Como disse entendo de PHP mas não entendo de Flex ou Flash :(

    Obrigado!
    PS. O tutorial está muito bom e é algo que com certeza muita gente vai usar. Vlw!

  4. Eduardo Kraus

    @Corintho Você pode faze-lo em Flash sem problema, eu fiz em Flex que é mais prático e rápido e domino.

    Agora para isso terás que conhecer Flash ou Flex. No caso do Flex, você terá que usar o Flex Builder 3, que tem versão Free.

  5. thiago lima

    Quando vou compilar o projeto da o seguinte erro:File not found: file:/H:/Documents%20and%20Settings/Administrador/Meus%20documentos/Downloads/post231/bin-debug/main.swf
    Como faço pra resolver esse problema
    Desde ja agradeço

  6. Eduardo Kraus

    @thiagoLima Certamente esta acontecendo algum erro na compilação do seu projeto. Verifique no projeto se existe la a pasta bin-debug e se dentro dela tem um arquivo swf.

  7. Wagner Sales

    Cara num tem esse script funcionando em algum lugar não!?
    que eu tou baixando o Flex Builder mas vai demorar dias

  8. Eduardo Kraus

    Aqui no Blog esta rodando...

  9. Ezequiel

    Olá Eduardo,
    Pra rodar esse aplicativo eu preciso do servidor de cfc ou nada disso, eu preciso desenvolver um sistema de cobrança on-line onde a pessoa do caixa captura a imagem do cliente e envia para o dpto de cobrança na matriz, isso dentro da intranet da empresa. Ficarei grato pela dica.

  10. Eduardo Kraus

    Não, somente de um servidor PHP.

  11. Ezequiel

    Eduardo,
    No flash, eu insiro isso como action script? Desculpe minha ignorância nisso, é que não trabalho com flash/flex.
    grato.

  12. Ezequiel

    Consegui, utilizando o flashdevelop.
    obrigado.

  13. Silva

    Olá Eduardo,

    Eu preciso usar esta solução num aplicativo Air. É possível salvar a imagem numa pasta no computador do usuário sem precisar do PHP (já que estou usando o Air)?

    Desde já agradeço qualquer ajuda.

  14. Eduardo Kraus

    @Silva Sim, use a classe File do AIR e salve a imagem em qualquer pasta.

  15. André

    Eduardo, estou usando perfeitamente esta aplicação sua, mas gostaria de capturar foto em 3x4, teria como me ajudar?

    Agradeço antecipadamente.

  16. Eduardo Kraus

    @André Simples, apenas defina a area de captura assim:
    <mx:VideoDisplay id="webcam" width="120" height="150"/>

  17. André

    de novo eu.....  =]

    Simples, apenas defina a area de captura assim: ...

  18. Jonnas

    Como eu faço para passar uma variavel da pagina para o recebeimagem.php?
    pois tenho um formulario em html/php, cujo um campo é o ID e gostaria de passar o ID na hora de salvar.

    desde já agradeço.

  19. Eduardo Kraus

    @Jonnas

    Adicione a variável a lista de <strong>request</strong>.

    <mx:request>
       <IMG>{imagemBase64}</IMG><
       <ID>{variavelID}</ID>
    </mx:request>

  20. Jonnas

    Eu não entende nda de Flash ou FLEX, voce poderia me ajudar, como eu adiciono a variavel a lista de requst? como passo o valor da variavel em php ou html para o flex?

  21. Eduardo Kraus

    Qual erro que acontece?

  22. Wellington

    Olá, tudo bom?!?!
    Eu não estou conseguindo fazer que webcam seja capturada.
    Diferente do seu.
    Será que há algum erro em meu código? Ou da Forma que estou fazendo?

    site--> http://atalaiasdosenhor.com.br/teste/lol/bin-debug/lol.html

  23. cLEVERTON

    COMO FARIA ISSO USANDO ASP?

  24. Eduardo Kraus

    @Cleverton Analise o código PHP e faça em ASP.

  25. Eduardo Kraus

    @Wellington Testei e esta funcionando

  26. André

    Eduardo poderia me explicar como fazer para esse código rodar mesmo q eu não esteja logado com a internet?
    Precisava desse código pra uma Intranet ..
    Como faço para ele rodar em LocalHost ?
    Aguardo resposta ..
    Valeu .

  27. Eduardo Kraus

    Funciona perfeitamente em independente se esta em Intranet ou extranet. Não existe diferença!!!!

  28. André

    eduardo consegui fazer rodar em localhost mais estou com dificuldade em relação a onde o arquivo é salvo .
    ele esta abrindo atravez de um link pelo seu site poderia me dizer qual alteração deve ser feita para salver em um diretório do meu servidor ?
    Valeu .

  29. André

    Eduardo favor desconciderar minha pergunta ..
    ja solucioneio o problema ..
    era sóprestar mais atenção ...
    Valeu aeee ..
    abraço.

  30. Luis Fernando

    Fala Eduardo, tdo tranquilo?
    bomm, eu testei no meu macbook porém não funciona, sabe me dizer pq nao funciona no mac?
    valeu!

  31. Luis Fernando

    não aparece a imagem, a permissao nao deve acessar a webcam do mac, tem uma alternativa na erb que vi que corrigi isso no flash pode adaptar pra flex será?
    abraços

  32. james

    nao conseguir salvar a imagem em localhost, ele ta salvando no servidor do seu site, e quando eu altero pra localhost nao salva. desde ja meus agradecimentos!

  33. Eduardo Kraus

    @James O Exemplo aponta para http://code.mxml.com.br/231/recebeImagem.php. Altere isso para uma URL relativa ao seu flash. Se em Localhost não salva tens problema de erro no PHP.

    Veja os logs que la esta o erro.

  34. Carlos Alberto

    Olá Eduardo, estou iniciando no mundo do flex, usando o flex sdk 3.5, terias uma dica de como complidar esse teu exemplo no sk?

    Grato

  35. Diego

    Ola!!

    Baixei os fontes mas sinceramente não sei por onde começar... alguém pode me ajudar?

    Tenho o WAMP2.0i instalado e tenho vários aplicativos que rodam normal, irei fazer um que ira receber a imagem da webcam e gravar no BD...

    Como faço para usar??

    Por favor me ajudem, esse material e de excelencia!!

  36. Diego

    Tenho que configurar algum arquivo? se sim quais, por favor...

  37. Diego

    ...tem q fazer as telas em flash?

  38. Ademir Gabardo

    Olá, o Scrip roda mas não chama a webcam grava uma imagem toda preta na pasta.
    Ele não dá o prompt pedindo a permissão da camera e não captura nada.
    O que poderia estar errado?

  39. Eduardo Kraus

    Duas opções:
    1° A sua webcam não esta disponível;
    2° Você bloqueou o acesso da Webcam ao Flash player. Clique com o botão direito sobre o Flash Player, vá em configurações e selecione privacidade. Ali tem que estar marcado o "Permitir" e o "Lembrar".

  40. Dinarte

    Eduardo bom dia, eu coloquei este seu exemplo em minha aplicação nele eu gravo no banco, o endereço onde está a foto, tudo funciona tranquilamente, o problema é que quando ja tem uma foto para o cadastro, eu preciso limpar o cach para ele poder mostrar a nova. como eu contorno isso?

  41. Eduardo Kraus

    Chame assim: pasta/arquivo.jpg?nocache=<strong>{numAleatório}</strong>

    Altere o <strong>numAleatório</strong> por um número aleatório.

  42. @alanmanga

    Olá, como eu faria para integrar essa imagem um formulário onde ela poderia ser enviada por e-mail ou enviar o link do endereço dela no servidor?

  43. Henrique

    Olá Eduardo,

    Estou com um problema que não consigo resolver de forma alguma. Se eu executar o código fonte de minha máquina, que é onde encontra-se o servidor web, o código funciona 100%. Porém se eu acessar este código de outra máquina a imagem não é salva no meu servidor e não dá mensagem nenhuma.

    O que posso estar fazendo de errado ?

  44. Eduardo Kraus

    Verifique se não estas configurando a URL de envio para Localhost.

  45. Cesar

    Ola teria como vc passar esse codigo todo em php.....
    So para eu ter uma ideia de como é...
    Obrigado

  46. Eduardo Kraus

    Os códigos estão todos disponíveis no site.

  47. daniel rocha da cunha

    È possivel capturar e exibir  foto tirada da webcam dentro de uma página php?

  48. Henrique

    baixei o código aki e instalei o flex builder 3, tudo certinho, o código ta sem nenhum erro, mas quando rodo a tela fica preta e nao mostra a imagem da webcam, sabes me dizer o que é, se eu abrir no seu tutorial funciona normal!

  49. Henrique

    Eduardo, quero lhe agradeçer, ótimo post, consegui rodar agora. ficou muito bom, adapatei as minhas necessidas e ficou ótimo, apesar de não saber programar em flex consegui adaptar certinho, espero que continue com esse trabalho ótimo. Parabens

  50. Wender Fernandes

    Parabéns pelo artigo. Tudo funciona perfeitamente. Tenho apenas uma pergunta. Dá para melhorar a qualidade da imagem? Usando o software da cam ela fica bem nitida, já no flash fica meio embaçado.
    Agradeço a cordial atenção.

  51. Eduardo Kraus

    @Wender podes melhorar assim:
    var camera:Camera=Camera.getCamera();
    webcam.setMode(320, 240, 30);
    webcam.attachCamera( camera );

    Agora a Webcam tem que ter qualidade boa, se não sairá ruim também.

  52. Douglas

    Kraus ,

    Gostaria de saber se é possivel eu aplicar essa função no PHP e gerar um site na rede para que as pessoas possam vizualizar minha webcam ao vivo ?????? Obrigado

  53. Eduardo Kraus

    @Douglas Não, PHp não da para fazer live streaming. Para isso terás que ter um servidor de FMS (http://influxis.com/) ou servidor dedicado com Red5(http://code.google.com/p/red5/)

  54. Rayfcrols

    Eduardo, desculpe minha ignorância em relação ao Flex, mais u to importando o projeto e quando rodo o main.mxml ele da erro "File not Found" main.swf

    Como proceder?  

  55. Eduardo Kraus

    @Rayfcrols Deve estar havendo erros quando compilas seu projeto. Se o main.swf não existe significa que o main.mxml não foi compilado por algum erro.

  56. Rayfcrols

    Correto, é porque estava importado eu projeto, apos excluir o proj e criar uma apenas usando seu script a aplicação rodou. PS: a aplicação captura a imagem, gera o foto, mais não salva no servidor fica so dando erro al salvar foto.

  57. Eduardo Kraus

    Ola. Edita o caminho /code/231/recebeImagem.php que esta no seu código fonte.

  58. Anderson

    Olá Eduardo! Primeiramente parabéns pelo blog. É de boas iniciativas como a sua que precisamos para lutar por nossos objetivos.

    Aproveitando, gostaria de saber como posso criar algo semelhante ao seu exemplo só que ao invés de enviar para uma pasta qualquer, gostaria de poder enviar essa imagem por email e postar no facebook e também adicionar uma moldura personalizada sobre a imagem capturada. Isso é possível? Grande abraço!

  59. Eduardo Kraus

    @Anderson. Com esta imagem você pode fazer com ela o que precisar.

  60. Ailton Silva

    Eduardo, por favor estou desenvolvendo um sistema de controle de acesso em PHP MySql, e estou com dificuldade para implemtar esta rotina de capturar a imagem de uma webcam e salvar no servidor remoto. Como faço ? Pois através desta sua aplicação não to sabemdo fazer funcionar, quando testo em seu site o exemplo aparece tudo preto e não captura a imagem da webcam.

    Preciso de um script pronto que possa adaptar ao meu sistema. Tem commo me ajudar nisso ? Abraço. Ailton.

  61. Junio Mota

    Ola eduardo, muito bom cara, estava procurando esta funcionalidade a tempos... Porém eu sou iniciante ainda, e não entendo nada de flex, uso o flash 8 ainda, antes de começar a mexer nesta funcionalidade preciso saber se funciona programando com o flash 8 ou preciso fazer o download do flex. antes de mais nada ja estou fazendo o download para aprender mais um prog bom...

    Obrigado!! Continue assim, ajudando a quem precisa. abraçoss!

  62. Eduardo Kraus

    @Junio É necessário que você saiba programar em AS3 pelo menos para conseguir algo com este exemplo. Eu só sei programar em AS3.

  63. Cesar

    como colocar isso na pagina do html

  64. Eduardo Kraus

    @Cesar É necessário que você compile o fonte do Flex e depois importe em seu site. O resultado é um SWF.

  65. vinicius

    Tambem estou com dificuldade para implementar este codigo no meu localhost. nao entendo nada de flex e isso me impede. Gostaria de saber mais detalhes sobre esse codigo, eu estou trabalhando com a linguagem PHP em mvc.

    Sou aluno da unochapecó e isso me ajudaria muito.

    Obrigado pela atençao.

  66. Eduardo Kraus

    Pegue o SWF do próprio site. Esta em http://flex.eduardokraus.com/code/231/main.swf

  67. vinicius

    e nao t5em como vc mandar
    o swf que vc gera pq aqui nao funcionou

  68. Lukas Heins

    Olá Eduardo,
    sabe me dizer se existe alguma restrição quanto ser aplicado em um servidor linux,
    pois a imagem é criada mas acaba ficando em branco ou toda distorcida. Comparei a string com a imagem codificada a nível de interface e ao chegar no php e, estavam iguais... não consegui chegar a uma solução. Obrigado.

  69. Eduardo Kraus

    Sem restrição. Algumas versões de Adobe Flash Player não fecha a caixa de permissão.

  70. Jefferson

    Boa Noite Eduardo!

    Parabéns antes de tudo.
    Estou com um problema, estou fazendo tudo como você indicou, aparece a web, clico pra salvar, vai tudo direito, mas não salva a imagem,já verifiquei o endereço, isso acontece tanto no localhost como numa host online.

  71. Rafael

    Tem como pegar esta imagem e imprimir atravéz de um template, sem ter que salvá-la em disco?

  72. Albert

    Boa tarde!
    eu copiei e colei esse código no Fb. não conheço o flex, gostaria de saber se preciso de mais alguma coisa para ele rodar, e deu esses erros aqui.

    Description    Resource    Path    Location    Type
    'webcam': identifier and class may not have the same name.    webcam.mxml    /webcam/src    line 93    Flex Problem
    /---------------------------------------------------------
    Description    Resource    Path    Location    Type
    Could not resolve <s:Image> to a component implementation.    webcam.mxml    /webcam/src    line 98    Flex Problem

  73. Jean Pierre

    Só é possivel compilar o codigo acima no Flex? ou no Flash tb dá?

  74. Albert Andrade Dias

    Boa tarde Eduardo!
    Não conheço muito bem AS
    Gostaria de saber como posso testar isso em localhost pois aqui não abre.

    Desde já agradeço a atenção

  75. carlos

    Ola, Eduardo como faço pra pegar a imagem tirada e guarda em uma vareavel!

  76. Lucas

    Muito Bom o script parabens, so uma obs.

    <s:Image

    talves de erro em algumas versao do flex para quem nao sabe como solucionar é só trocar por:

    <mx:Image

  77. Deivid Landim

    Eduardo Kraus,
    como eu faço para usar com java web  em página jsp?
    se tiver como você me mandar um exemplo, depois passo o e-mail. Obrigado.

  78. Gilmar

    Curti, muito bom
    vlww

  79. Wagner Sales

    o navegado não ta mais ligando a camera, tenho esse script rodando desde 2009, mas agora ele não liga mais a camera, até aki no blog, que antes abria, agora não abre mais

  80. Eduardo Kraus

    Tenta reinstalar o Flash player ou verificar se a sua Câmera é identificada pelo Flash Player.

Deixe uma resposta