Чтение файла, созданного плагином захвата мультимедиа в Кордове - Создание эскизов

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

Я хотел бы создать миниатюру каждой фотографии, снятой камерой моего приложения, и сохранить их либо локально, либо в серверной базе данных. Однако я не нашел хорошего решения.

Я попробовал здесь плагин для миниатюр, но после установки моя сборка не удалась. Я думаю, что это поддерживает только Cordova до 2.9, а я использую 3.3:

https://github.com/maxbasmanov/PhoneGap_Thumbnailer

В любом случае, мой следующий план - использовать холст HTML5, чтобы изменить размер изображения в точке захвата и сохранить его вместе с изображением в полном разрешении. С трудом справляясь с этим. Я успешно снимаю изображения с помощью плагина для захвата мультимедиа, который сохраняет в любую папку, которая мне нравится. Кажется, я не могу прочитать этот файл с помощью fileReader.

URL-адреса mediaFile выглядят так: file: /storage/emulated/0/DCIM/Camera/235243652435123.jpg и FileSystem: cdvfile: // localhost / persistent

Метод filesystem.root.getFile не работает с 5: undefined. Может, я ошибаюсь?

Вот мой код:

function captureSuccess(mediaFiles) { 


      function gotFS(fileSystem) {
        for (var a in mediaFiles) {
          alert('file fullpath: ' + mediaFiles[a].fullPath);
          alert('filesystem URL: ' + fileSystem.root.toURL());
          window.resolveLocalFileSystemURL(mediaFiles[a].fullPath, function(fileEntry) {
                fileEntry.file(function(fileObj) {

                    alert(JSON.stringify(fileObj));
                    newimageURI = fileObj.localURL;
                    alert(newimageURI);

                },
                function(error) {
                  alert('get fileEntry error: ' + error.message);  
                });
              },
              function(error) {
                alert('resolve error: ' + error.message);
              });


              fileSystem.root.getFile(mediaFiles[a].fullPath, {create: false}, gotFileEntry, fail);
           };

      }

      function gotFileEntry(fileEntry) {
        alert('got fileentry');
        fileEntry.file(gotFile, fail);
      }

      function gotFile(file){
        alert('got file');
        resizeFile(file);
      }

      function readDataUrl(file) {
          var reader = new FileReader();
          reader.onloadend = function(evt) {
              console.log("Read as data URL");
              console.log(evt.target.result);
          };
          reader.readAsDataURL(file);
      }

      function fail(error) {
          alert(error.code + ': ' + error.message);
      }

      function resizeFile(file) {
        alert('resize initiated');
        var reader = new FileReader();
        reader.onloadend = function(evt) {         
          alert('read data: ' + evt.target.result);
          var tempImg = new Image();
          tempImg.src = file;
          tempImg.onload = function() {

              var MAX_WIDTH = 250;
              var MAX_HEIGHT = 250;
              var tempW = tempImg.width;
              var tempH = tempImg.height;
              if (tempW > tempH) {
                  if (tempW > MAX_WIDTH) {
                     tempH *= MAX_WIDTH / tempW;
                     tempW = MAX_WIDTH;
                  }
              } else {
                  if (tempH > MAX_HEIGHT) {
                     tempW *= MAX_HEIGHT / tempH;
                     tempH = MAX_HEIGHT;
                  }
              }

              var canvas = document.createElement('canvas');
              canvas.width = tempW;
              canvas.height = tempH;
              var ctx = canvas.getContext("2d");
              ctx.drawImage(this, 0, 0, tempW, tempH);
              var dataURL = canvas.toDataURL("image/jpeg");

              alert('image: ' + JSON.stringify(dataURL));
            }
          }
          reader.readAsDataURL(file);
      }

    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);

person mpsyp    schedule 07.04.2014    source источник
comment
Что произойдет, если вы используете resolveLocalFileSystemURL () для URL-адреса file: //, чтобы получить запись в файле?   -  person Raymond Camden    schedule 10.04.2014
comment
Добавил обработчики ошибок в код resolveLocalFileSystemURL () и повторил попытку. undefined - это сообщение об ошибке.   -  person mpsyp    schedule 10.04.2014
comment
Вы получили это конкретно при вызове resolveLocalFileSystemURL?   -  person Raymond Camden    schedule 10.04.2014
comment
Правильный. Первый обработчик ошибок в rLFSURL вызывается с ошибкой разрешения: undefined. Другой побочный вопрос: в чем разница между URL-адресом файла, который я получаю из плагина захвата мультимедиа, и URI? Мне сложно понять, являются ли они одним и тем же ... спасибо, что придерживаюсь этого!   -  person mpsyp    schedule 11.04.2014
comment
Ух, ты меня сюда привел. Какую платформу вы используете для тестирования?   -  person Raymond Camden    schedule 11.04.2014
comment
Тестирую на Droid RAZR Maxx, кажется, Android 4.2. У меня есть доступ к Nexus 5 с 4.4 на нем, но я еще не тестировал его.   -  person mpsyp    schedule 11.04.2014
comment
Вы бы чувствовали себя комфортно, поделившись со мной кодом?   -  person Raymond Camden    schedule 11.04.2014
comment
comment
Это похоже на дубликат, но здесь есть дополнительная информация, которая может быть кому-то полезна. В консоли Chrome, например, говорится, что метод resolveLocalFileSystemURI устарел, и используется метод resolveLocalFileSystemURL, но последний не работает. Я несколько дней пробовал использовать метод URL, пока не попробовал URI ...   -  person mpsyp    schedule 23.05.2014
comment
Чтобы получить сообщение об ошибке #, вам нужно прочитать error.code, а не error.message.   -  person Chris Rae    schedule 21.05.2015


Ответы (1)


Решено!

Необходимо использовать

window.resolveLocalFileSystemURI ("content: // media / external / images / media / 4292", победа, ошибка);

не URL.

PhoneGap - сохранение изображения, а затем получение его данных в кодировке base64

person mpsyp    schedule 04.05.2014
comment
FWIW для меня это отображается в консоли resolveLocalFileSystemURI устарел. Вместо этого вызовите resolveLocalFileSystemURL. Это тоже не работает (по крайней мере, для меня, но у меня может быть другая проблема). - person Chris Rae; 21.05.2015