Улучшить функцию getExif - PullRequest
0 голосов
/ 20 июня 2019

В настоящее время я создаю веб-сайт, который позволяет пользователям загружать изображение в область предварительного просмотра, а затем они могут нажать кнопку, чтобы отобразить информацию EXIF.

Я использую библиотеку exif.js, чтобы сделать эту работу, используя функцию с именем "getExif" ...

В данный момент он действительно работает ... Пользователь загружает изображение, и когда нажимается кнопка «Загрузить историю», отображается информация EXIF. В этом случае я заставил его показать карту iFrame с местоположением захвата, отображаемым в виде «маркера» при получении информации GPS, а кроме того, я также показываю производителя и модель используемой камеры, а также дату и время захвата.

Это выглядит так:

enter image description here

«Проблема»:

Некоторые изображения содержат только некоторую информацию EXIF, а некоторые вообще нет ...

Я бы хотел изменить мою функцию getExif так, чтобы она отображалась как «Нет информации exif», если ее нет, или отображается как «нет информации» вместо конкретной информации EXIF ​​...

В настоящее время это работает, только если ВСЕ данные, которые я хочу показать, находятся на рисунке ..

Если я попытаюсь использовать изображение, содержащее всю информацию справа, НО не имеет GPS-координат, оно просто не будет работать вообще ... не будет отображать ЛЮБУЮ информацию ...

Итак, как мне изменить приведенный ниже код, чтобы AT LEAST отображал какое-то предупреждение на случай отсутствия какой-либо информации EXIF?

(Лучше всего проверить его для каждого информационного элемента, как я описал ранее ...)


// Funções para converter a latitude e longitude para um valor legível pelo Google Maps
// Neste caso está a passar de "Degrees Minutes Seconds" (DMS) para decimal

        var toDecimal = function (number) {


            var d = number[0];
            var m = number[1];
            var s = number[2];  
            var dms= (d+(m/60+s/3600)).toFixed(6);

            return dms;

        };

        var toDecimal_Neg = function (number) {


            var d = number[0];
            var m = number[1];
            var s = number[2];

            var dms= (d+(m/60)+s/3600).toFixed(6);
            var dms_neg=-Math.abs(dms);

            return dms_neg;     
        };


        link_mapa = document.getElementById("link");

        botao = document.getElementById("show_exif");

        botao.onclick=getExif;

        function getExif() {
            img1 = document.getElementById("img1");
            EXIF.getData(img1, function() {

            // Criação das variáveis e atribuição de valores às mesmas  

            marca = EXIF.getTag(this, "Make");  // Fabricante da câmara
            modelo = EXIF.getTag(this, "Model");    // Modelo da câmara
            data_hora = EXIF.getTag(this, "DateTimeOriginal") // Data e hora de captura da foto
            latitude = EXIF.getTag(this, "GPSLatitude");    // latitude
            longitude = EXIF.getTag(this, "GPSLongitude");  // longitude
            latitude_POS = EXIF.getTag(this, "GPSLatitudeRef"); // Norte ou Sul --> Consequentemente será positiva ou negativa
            longitude_POS = EXIF.getTag(this, "GPSLongitudeRef"); // Este ou Oeste --> Consequentemente será positiva ou negativa


            // Elementos presentes no código HTML onde se vai apresentar a informação do EXIF através das variáveis criadas acima

            marca_tag = document.getElementById("marca");
            modelo_tag = document.getElementById("modelo");
            data_hora_tag = document.getElementById("data_hora");       
            local_lat = document.getElementById("local_lat");
            local_lon = document.getElementById("local_lon");
            latitude_NS = document.getElementById("lat_NS");                        
            longitude_ES = document.getElementById("lon_ES");

            // Vai testar se a latitude é Norte ou Sul e se a Longitude é Este ou Oeste...
            // Consequentemente serão atribuídos valores negativos ou positivos

            if(latitude_POS==="N"){
                latitude_final = toDecimal(latitude);
            }else if(latitude_POS==="S"){
                latitude_final = toDecimal_Neg(latitude);   
            }
            local_lat_final = document.getElementById("local_lat_final");
            local_lat_final.innerHTML = `${latitude_final}`;

            if(longitude_POS==="E"){
                longitude_final = toDecimal(longitude);
            }else if(longitude_POS==="W"){
                longitude_final = toDecimal_Neg(longitude); 
            }   

            // "Mandar" a informação para os elementos através das variáveis

            marca_tag.innerHTML = `${marca}`;
            modelo_tag.innerHTML = `${modelo}`;

            data_hora_tag.innerHTML = `${data_hora}`;   

            local_lat.innerHTML = `${latitude}`;
            local_lon.innerHTML = `${longitude}`;
            latitude_NS.innerHTML = `${latitude_POS}`;                      
            longitude_ES.innerHTML = `${longitude_POS}`;

            local_lon_final = document.getElementById("local_lon_final");
            local_lon_final.innerHTML = `${longitude_final}`;   

            document.getElementById("mapa_google").src = "https://www.google.com/maps/embed/v1/place?key=AIzaSyDQSbRMCIv1gDsT2qRsY8HvLyZP11hte_Y&q="+latitude_final+"+"+longitude_final;                

            document.getElementById("link_area").value = "https://www.google.com/maps/place?key=AIzaSyDQSbRMCIv1gDsT2qRsY8HvLyZP11hte_Y&q="+latitude_final+"+"+longitude_final; 

            //Mostrar a secção com a info EXIF e redirecionar o ecrã para a mesma

            var x = document.getElementById("exif_itens");
            if (window.getComputedStyle(x).display === "none") {
                x.style.display = "block";

            x.scrollIntoView({ block: 'end',  behavior: 'smooth' }); //Redireciona o ecrã para a área dos dados exif
            }

            });


        }



1 Ответ

1 голос
/ 20 июня 2019

Основная проблема проистекает из ваших условных операторов, которые устанавливают final_latitude и final_longitude. Что произойдет, если latitude_POS не является ни N, ни S (как не определено!). То же самое относится и к longitude_POS.

Вот что происходит, когда на изображении нет геоданных.

Таким образом, для каждого из этих условий используйте окончательное else - перехват этого условия и выполните шаги, необходимые для уведомления пользователя об отсутствии геоданных, в то же время устанавливая флаг, чтобы карта не отображается.

...