Jump to content
erissonamorim

Usar câmera traseira do celular

Recommended Posts

Olá pessoal, tudo certo?!

Estou com um código que está funcionando bem. Mas gostaria de que a câmera traseira do celular fosse a padrão.

Abaixo segue o código, caso possam me ajudar a efetuar esta alteração.

Desde já, agradeço!

(function () {
    var video = document.querySelector('video');

    var pictureWidth = 640;
    var pictureHeight = 360;

    var fxCanvas = null;
    var texture = null;

    function checkRequirements() {
        var deferred = new $.Deferred();

        //Check if getUserMedia is available
        if (!Modernizr.getusermedia) {
            deferred.reject('Your browser doesn\'t support getUserMedia (according to Modernizr).');
        }

        //Check if WebGL is available
        if (Modernizr.webgl) {
            try {
                //setup glfx.js
                fxCanvas = fx.canvas();
            } catch (e) {
                deferred.reject('Sorry, glfx.js failed to initialize. WebGL issues?');
            }
        } else {
            deferred.reject('Your browser doesn\'t support WebGL (according to Modernizr).');
        }

        deferred.resolve();

        return deferred.promise();
    }

    function searchForRearCamera() {
        var deferred = new $.Deferred();

        //MediaStreamTrack.getSources seams to be supported only by Chrome
        if (MediaStreamTrack && MediaStreamTrack.getSources) {
            MediaStreamTrack.getSources(function (sources) {
                var rearCameraIds = sources.filter(function (source) {
                    return (source.kind === 'video' && source.facing === 'environment');
                }).map(function (source) {
                    return source.id;
                });

                if (rearCameraIds.length) {
                    deferred.resolve(rearCameraIds[0]);
                } else {
                    deferred.resolve(null);
                }
            });
        } else {
            deferred.resolve(null);
        }

        return deferred.promise();
    }

    function setupVideo(rearCameraId) {
        var deferred = new $.Deferred();
        var videoSettings = {
            video: {
                optional: [
                    {
                        width: { min: pictureWidth }
                    },
                    {
                        height: { min: pictureHeight }
                    }
                ]
            }
        };

        //if rear camera is available - use it
        if (rearCameraId) {
            videoSettings.video.optional.push({
                sourceId: rearCameraId
            });
        }

        navigator.mediaDevices.getUserMedia(videoSettings)
            .then(function (stream) {
                //Setup the video stream
                video.srcObject = stream;

                video.addEventListener("loadedmetadata", function (e) {
                    //get video width and height as it might be different than we requested
                    pictureWidth = this.videoWidth;
                    pictureHeight = this.videoHeight;

                    if (!pictureWidth && !pictureHeight) {
                        //firefox fails to deliver info about video size on time (issue #926753), we have to wait
                        var waitingForSize = setInterval(function () {
                            if (video.videoWidth && video.videoHeight) {
                                pictureWidth = video.videoWidth;
                                pictureHeight = video.videoHeight;

                                clearInterval(waitingForSize);
                                deferred.resolve();
                            }
                        }, 100);
                    } else {
                        deferred.resolve();
                    }
                }, false);
            }).catch(function () {
                deferred.reject('There is no access to your camera, have you denied it?');
            });

        return deferred.promise();
    }

    function step1() {
        checkRequirements()
            .then(searchForRearCamera)
            .then(setupVideo)
            .done(function () {
                //Enable the 'take picture' button
                $('#takePicture').removeAttr('disabled');
                //Hide the 'enable the camera' info
                $('#step1 figure').removeClass('not-ready');
            })
            .fail(function (error) {
                showError(error);
            });
    }

    function step2() {
        var canvas = document.querySelector('#step2 canvas');
        var img = document.querySelector('#step2 img');

        //setup canvas
        canvas.width = pictureWidth;
        canvas.height = pictureHeight;

        var ctx = canvas.getContext('2d');

        //draw picture from video on canvas
        ctx.drawImage(video, 0, 0);

        //modify the picture using glfx.js filters
        texture = fxCanvas.texture(canvas);
        fxCanvas.draw(texture)
            .hueSaturation(-1, -1)//grayscale
            .unsharpMask(20, 2)
            .brightnessContrast(0.2, 0.9)
            .update();

        window.texture = texture;
        window.fxCanvas = fxCanvas;

        $(img)
            //setup the crop utility
            .one('load', function () {
                if (!$(img).data().Jcrop) {
                    $(img).Jcrop({
                        onSelect: function () {
                            //Enable the 'done' button
                            $('#adjust').removeAttr('disabled');
                        }
                    });
                } else {
                    //update crop tool (it creates copies of <img> that we have to update manually)
                    $('.jcrop-holder img').attr('src', fxCanvas.toDataURL());
                }
            })
            //show output from glfx.js
            .attr('src', fxCanvas.toDataURL());
    }

    function step3() {
        var canvas = document.querySelector('#step3 canvas');
        var step2Image = document.querySelector('#step2 img');
        var cropData = $(step2Image).data().Jcrop.tellSelect();

        var scale = step2Image.width / $(step2Image).width();

        //draw cropped image on the canvas
        canvas.width = cropData.w * scale;
        canvas.height = cropData.h * scale;

        var ctx = canvas.getContext('2d');
        ctx.drawImage(
            step2Image,
            cropData.x * scale,
            cropData.y * scale,
            cropData.w * scale,
            cropData.h * scale,
            0,
            0,
            cropData.w * scale,
            cropData.h * scale);

        var spinner = $('.spinner');
        spinner.show();
        $('blockquote p').text('');
        $('blockquote footer').text('');

        // do the OCR!
        Tesseract.recognize(ctx).then(function (result) {
            var resultText = result.text ? result.text.trim() : '';

            //show the result
            spinner.hide();
            $('blockquote p').html('&bdquo;' + resultText + '&ldquo;');
            $('blockquote footer').text('(' + resultText.length + ' characters)');
        });
    }

    /*********************************
     * UI Stuff
     *********************************/

    //start step1 immediately
    step1();
    $('.help').popover();

    function changeStep(step) {
        if (step === 1) {
            video.play();
        } else {
            video.pause();
        }

        $('body').attr('class', 'step' + step);
        $('.nav li.active').removeClass('active');
        $('.nav li:eq(' + (step - 1) + ')').removeClass('disabled').addClass('active');
    }

    function showError(text) {
        $('.alert').show().find('span').text(text);
    }

    //handle brightness/contrast change
    $('#brightness, #contrast').on('change', function () {
        var brightness = $('#brightness').val() / 100;
        var contrast = $('#contrast').val() / 100;
        var img = document.querySelector('#step2 img');

        fxCanvas.draw(texture)
            .hueSaturation(-1, -1)
            .unsharpMask(20, 2)
            .brightnessContrast(brightness, contrast)
            .update();

        img.src = fxCanvas.toDataURL();

        //update crop tool (it creates copies of <img> that we have to update manually)
        $('.jcrop-holder img').attr('src', fxCanvas.toDataURL());
    });

    $('#takePicture').click(function () {
        step2();
        changeStep(2);
    });

    $('#adjust').click(function () {
        step3();
        changeStep(3);
    });

    $('#go-back').click(function () {
        changeStep(2);
    });

    $('#start-over').click(function () {
        changeStep(1);
    });

    $('.nav').on('click', 'a', function () {
        if (!$(this).parent().is('.disabled')) {
            var step = $(this).data('step');
            changeStep(step);
        }

        return false;
    });
})();

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By belann
      Olá!
       
      Estou usando o editor quill em uma página html, sem fazer a instalação com npm, mas usando as api´s via internet com http, no entanto não consigo fazer a tecla enter funcionar para mudança de linha, tentei essa configuração abaixo, mas não funcionou.
       
      modules: {       syntax: true,       toolbar: '#toolbar-container',       keyboard: {         bindings: {           enter: {             key: 13,             handler: function(range, context) {                       quill.formatLine(range.index, range.length, { 'align': '' });             }           }  
       
    • By violin101
      Caros amigos, saudações.
       
      Gostaria de poder tirar uma dúvida com os amigos.
       
      Como faço uma função para Comparar a Data Digitada pelo o Usuário com a Data Atual ?

      Data Digitada:  01/09/2024
       
      Exemplo:
      25/09/2024 é menor que DATA Atual  ====> mensagem: informe uma data válida.
      25/09/2024 é igual DATA Atual ===> o sistema libera os INPUT's.
       
      Como faço uma comparação com a Data Atual, para não Deixar Gravar Data retroativa a data Atual.
       
      Grato,
       
      Cesar
    • By Rafael Castelhano
      Olá, quero preencher um dict dinamicamente onde a chave é uma string multidimencional no dict, ex:
      var dict = {} var path = 'a.b.c' dict[path] = 55 // isso faz dict ficar desta forma {'a.b.c': 55} // mais quero que fique assim {a: {b: {c: 55}}} Como consigo alterar desta forma? 
    • By violin101
      Caros amigos, saudações.
       
      Estou com um problema de cálculo que não estou conseguindo resolver.
       
      Tenho uma rotina em Javascript que faz o seguinte cálculo qtde x vrUnit = total.
       
      qtde   x  vrUnit    =    total
      1,23   x  1,00       =    1,23    << até aqui tudo bem.
       
      o problema seria fazer o arredondamento para cima para impedir de fazer este cálculo:
      0,01 x 0,01 = 0,0001
       
      para digitar o valor estou utilizando esta função:
       
      /*Esta função quando o usuário digitar o valor aparece * 1,23 */ function formataDigitacao(i) { //Adiciona os dados para a másrcara var decimais = 2; var separador_milhar = '.'; var separador_decimal = ','; var decimais_ele = Math.pow(10, decimais); var thousand_separator = '$1'+separador_milhar; var v = i.value.replace(/\D/g,''); v = (v/decimais_ele).toFixed(decimais) + ''; var splits = v.split("."); var p_parte = splits[0].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, thousand_separator); (typeof splits[1] === "undefined") ? i.value = p_parte : i.value = p_parte+separador_decimal+splits[1]; } /*Esta função faz a multiplicação entre Valor Unitário X Quantidade *faz a multiplicação correta */ function calcProd(){ //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Obter valor digitado do produto var valor_unit = document.getElementById("vlrunit").value; //Remover ponto e trocar a virgula por ponto while (valor_unit.indexOf(".") >= 0) { valor_unit = valor_unit.replace(".", ""); } valor_unit = valor_unit.replace(",","."); //Calcula o Valor do Desconto if (valor_unit > 0 && prod_qtde > 0) { calc_total_produto = (parseFloat(valor_unit) * parseFloat(prod_qtde)); var numero = calc_total_produto.toFixed(2).split('.'); //<<== aqui faço o arredondamento das casas decimais de 1,234 p/ 1,23 numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("vlrtotal").value = numero.join(','); } else { if (valor_unit > 0) { document.getElementById("vlrtotal").value = document.getElementById("vlrunit").value; } else { document.getElementById("vlrtotal").value = "0,00"; } } } Grato,
       
      Cesar
    • By violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida e não estou conseguindo resolver.
       
      Tenho um SELECT onde eu pego o ID e NOME_CAMPO, até aqui tudo bem.
       
      Para evitar erros de saída de produtos por estoque, preciso passar o ID do Centro de Custo, para gerar a Tabela de produtos em estou por cada centro de Custo.

      Exemplo:
      Centro de Custo 1 - tem:
      produto A | produto B | produto C

      Centro de Custo 2 - tem:
      produto D | produto E

      Como consigo pegar via JAVASCRIPT o código do Centro de Custo selecionado e passar para a Controller, para chamar a MODAL ?

      meu código está assim:
      VIEW
       
      <div class="col-md-6"> <label for="deptsOrigem">Dpto Origem:</label> <div class="input-group mb-3"> <input type="hidden" name="idCentrocusto" id="idCentrocusto"> <input type="text" class="form-control" id="nameCentrocusto" name="nameCentrocusto" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por Centro de Custo" disabled> <span class="input-group-btn"> <button class="btn btn-primary" type="button" id="btnOrgn" name="btnOrgn" data-toggle="modal" data-target="#modal_deptsOrigem" > <span class="fa fa-search"></span> Buscar </button> </span> </div> </div> <div class="modal fade" id="modal_deptsOrigem"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header" style="font-size:18px; color:#ffffff; background:#307192;"> <h4 class="modal-title"><strong>Lista do(s) Centro de Custo(s)</strong></h4> </div> <div class="modal-body"> <table id="deptsLista" class="table table-bordered table-hover"> <thead> <tr> <th style="text-align:center;">Código</th> <th style="text-align:center;">Centro de Custo(s)</th> <th style="text-align:center;">Ação</th> </tr> </thead> <tbody id="itensDeptos"> <!---Monta Tabela VIA Ajax---> </tbody> </table> </div> <div class="modal-footer justify-content-center" style="background:#BBAAAA;"> <button type="button" class="btn btn-danger pull-center" data-dismiss="modal">Voltar</button> </div> </div><!-- /.modal-content --> </div><!-- /.modal-dialog --> </div>  
      o JAVASCRIPT está assim:
       
      //Função para Chamar o Centro de Custo que o usuário deseja. listaDeptos(); var table = $('#deptsLista').dataTable({ "searching": true, "ordering": true, "info": true, "autoWidth": false, "pageLength": 5, "lengthMenu": [ 5, 10, 25, 50 ], "responsive": true, }); // list all employee in datatable function listaDeptos(){ $.ajax({ type : 'ajax', url : '<?=base_url()?>estoque/consumo/deptsList/', async : false, dataType : 'json', success : function(data){ var html = ''; var i; for(i=0; i<data.length; i++){ var datadpts = data[i].idDepartamento+"*"+data[i].departamento; html += '<tr>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].idDepartamento+'</td>'+ '<td width="50%" style="text-align:left; font-size:16px;">'+data[i].departamento+'</td>'+ '<td width="10%" style="text-align:center;">'+ '<button type="button" class="btn btn-success btn_orgns" style="margin-right: 1%; padding: 2px 5px;" title="Selecionar Departamento" value="'+datadpts+'"><span class="fa fa-check"></span></button>'+ '</td>'+ '</tr>'; } //Fim - For $('#itensDeptos').html(html); } //Fim - success }); //Fim - ajax } //Fim - function /*---Função para Capturar o Departamento selecionado---*/ $(document).on("click",".btn_orgns",function(){ dpts = $(this).val(); infodpts = dpts.split("*"); $("#idCentrocusto").val(infodpts[0]); $("#nameCentrocusto").val(infodpts[1]); $("#modal_deptsOrigem").modal("hide"); //Função para Atualizar o Status do Botão statusPesqProd(); }); //Função para Gerar a Lista de Produtos por Centro de Custo via AJAX. listaProduts(); var table = $('#prdsLista').dataTable({ "searching": true, "ordering": true, "info": true, "autoWidth": false, "pageLength": 5, "lengthMenu": [ 5, 10, 25, 50 ], "responsive": true, }); // list all employee in datatable function listaProduts(){ $.ajax({ type : 'ajax', url : '<?=base_url()?>estoque/consumo/produtsList/', //< como passo aqui o ID do Centro de Custo Selecionado para Gerar a Lista de Produtos async : false, dataType : 'json', success : function(data){ var html = ''; var i; for(i=0; i<data.length; i++){ var prds = data[i].idProdutos+"*"+data[i].cod_interno+"*"+data[i].descricao+"*"+data[i].prd_unid+"*"+data[i].estoque_atual; html += '<tr>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].cod_interno+'</td>'+ '<td width="50%" style="text-align:left; font-size:16px;">'+data[i].descricao+'</td>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].prd_unid+'</td>'+ '<td width="15%" style="text-align:center; font-size:16px;">'+data[i].estoque_atual+'</td>'+ '<td width="12%" style="text-align:center;">'+ '<button type="button" class="btn btn-success btn-prod" style="margin-right: 1%; padding: 2px 5px;" title="Selecionar Produto" value="'+prds+'"><span class="fa fa-check"></span></button>'+ '</td>'+ '</tr>'; } //Fim - For $('#itensProds').html(html); } //Fim - success }); //Fim - ajax } //Fim - function  
      a CONTROLLER está assim:
      //Função para Criar Lista - Produtos Data Tables com AJAX function produtsList(){ $data = $this->consumo_model->prodsList(); echo json_encode($data); }  
       
       
      Grato,
       
      Cesar
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.