Escolar Documentos
Profissional Documentos
Cultura Documentos
HTML5
Vamos começar criando nosso exemplo com os elementos HTML. Tudo o que
realmente precisamos é de uma tag button e uma tag video, mas para poder
visualizar o exemplo, vamos colocar o retorno em um img, link da imagem gerada e
um textarea para vermos o base64.
<div class="area">
<video autoplay="true" id="webCamera"></video>
<input type="text" id="base_img" name="base_img"/>
<button type="button" onclick="takeSnapShot()"> Tirar foto e salvar </button>
<img id="imagemConvertida"/>
<p id="caminhoImagem" class="caminho-imagem"><a href="" target="_blank"></a></p>
<script src="script.js"></script>
</div>
Não precisamos necessariamente de um CSS para poder funcionar, mas, apenas
para exemplo, vamos colocar um CSSzinho…
body{
font-family: sans-serif;
margin: 0;
}
.area{
margin: 10px auto;
box-shadow: 0 10px 100px #ccc;
padding: 20px;
box-sizing: border-box;
max-width: 500px;
}
.area video{
width: 100%;
height: auto;
background-color: whitesmoke;
}
.area textarea{
width: 100%;
margin-top: 10px;
height: 80px;
box-sizing: border-box;
}
.area button{
-webkit-appearance: none;
width: 100%;
box-sizing: border-box;
padding: 10px;
text-align: center;
background-color: #068c84;
color: white;
text-transform: uppercase;
border: 1px solid white;
box-shadow: 0 1px 5px #666;
}
.area button:focus{
outline: none;
background-color: #0989b0;
}
.area img{
max-width: 100%;
height: auto;
}
.area .caminho-imagem{
padding: 5px 10px;
border-radius: 3px;
background-color: #068c84;
text-align: center;
}
.area .caminho-imagem a{
color: white;
text-decoration: none;
}
function loadCamera(){
//Captura elemento de vídeo
var video = document.querySelector("#webCamera");
//As opções abaixo são necessárias para o funcionamento correto no iOS
video.setAttribute('autoplay', '');
video.setAttribute('muted', '');
video.setAttribute('playsinline', '');
//--
Você deve ter notado que a função acima tem um comentário com alguns
parâmetros adicionais. Esses parâmetros são necessários para o funcionamento no
iOS.
Já a função takeSnapShot irá justamente tirar o instantâneo. Essa função irá criar um
elemento canvas e desenhar em seu conteúdo uma imagem matricial, baseada no
vídeo (um ctrl+c / ctrl+v automático, digamos assim). A partir daí podemos obter
o base64 desse canvas e utilizá-lo para enviar posteriormente.
function takeSnapShot(){
//Captura elemento de vídeo
var video = document.querySelector("#webCamera");
//Criando o JPG
var dataURI = canvas.toDataURL('image/jpeg'); //O resultado é um BASE64 de uma
imagem.
document.querySelector("#base_img").value = dataURI;
Agora, precisamos enviar essa base64 para o PHP. Usaremos o PHP para salvar a
imagem em um arquivo jpg (você pode optar por png também). O PHP irá retornar,
posteriormente, um json com o caminho completo da imagem, que iremos carregar
no objeto img descrito no HTML supracitado. Faremos isso dinamicamente, por
técnica de Ajax, sem formulário, pois o submit de um form poderá ser usado
futuramente para a conclusão de um determinado cadastro:
function sendSnapShot(base64){
var request = new XMLHttpRequest();
request.open('POST', 'save_photos.php', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-
8');
<pre><code> request.onload = function() {
console.log(request);
if (request.status >= 200 && request.status < 400) {
//Colocar o caminho da imagem no SRC
var data = JSON.parse(request.responseText);
//verificar se houve erro
if(data.error){
alert(data.error);
return false;
}
//Mostrar informações
document.querySelector("#imagemConvertida").setAttribute("src", data.img);
document.querySelector("#caminhoImagem a").setAttribute("href", data.img);
document.querySelector("#caminhoImagem a").innerHTML = data.img.split("/")[1];
} else {
alert( "Erro ao salvar. Tipo:" + request.status );
}
};
request.onerror = function() {
alert("Erro ao salvar. Back-End inacessível.");
}
PHP
No lado do PHP, basicamente, usaremos um $_POST para capturar o dado enviado
via Ajax pelo Javascript. Criaremos então o arquivo salvar_photos.php.
//data
$data = explode(',', $data);
//Save data
file_put_contents($path, base64_decode(trim($data[1])));
//Print Data
$result['img'] = $path;
echo json_encode($result, JSON_PRETTY_PRINT);
?>
Uma vez tudo pronto, basta chamar a função loadCamera() no evento que você quer
que ele seja disparado.
Como sempre, deixamos o código disponível para quem quiser utilizar. Desta vez, o
código está no GitHub.
Follow @velhobit 20