Cordova Image Picker转换为base64

时间:2015-04-05 11:43:30

标签: javascript angularjs cordova

我无法将图片转换为使用ngCordova imagePicker选择的base64格式。

为了简单起见,Cordova网站上提供的代码(有效)是:

module.controller('ThisCtrl', function($scope, $cordovaImagePicker) {

  var options = {
   maximumImagesCount: 10,
   width: 800,
   height: 800,
   quality: 80
  };

  $cordovaImagePicker.getPictures(options)
    .then(function (results) {
     for (var i = 0; i < results.length; i++) {
    console.log('Image URI: ' + results[i]);
  }
}, function(error) {
  // error getting photos
});
});

结果数组返回一个结果数组,如:file /// ...但是如何从这里转换?我想要一个函数,你将值传递给(文件)并返回base64字符串。

这是一个尝试这个的功能:

function convertImgToBase64URL(url, callback, outputFormat){

        var canvas = document.createElement('CANVAS'),
            ctx = canvas.getContext('2d'),
            img = new Image();
        img.crossOrigin = 'Anonymous';
        img.onload = function(){
            var dataURL;
            canvas.height = img.height;
            canvas.width = img.width;
            ctx.drawImage(img, 0, 0);
            dataURL = canvas.toDataURL(outputFormat);
            callback(dataURL);
            canvas = null; 
        };
        img.src = url;
    };

但是如何将它集成到代码中呢?

我试过这个(只需要选择一张图片):

$cordovaImagePicker.getPictures(options)
                .then(function (results) {
                    convertImgToBase64URL(results[0], function(base64Img){

                        self.chosenImage = base64Img;                                
                    });                          

             }, function(error) {
                console.log(error);
             }); 

但是self.chosenImage被设置为空白。

可能是一个异步问题,但如何最好地解决它?

4 个答案:

答案 0 :(得分:10)

您可以使用$ cordovaCamera并将sourceType更改为Camera.PictureSourceType.PHOTOLIBRARY吗?

document.addEventListener("deviceready", function () {

    var options = {
      quality: 50,
      destinationType: Camera.DestinationType.DATA_URL,
      sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
      allowEdit: true,
      encodingType: Camera.EncodingType.JPEG,
      targetWidth: 100,
      targetHeight: 100,
      popoverOptions: CameraPopoverOptions,
      saveToPhotoAlbum: false
    };

    $cordovaCamera.getPicture(options).then(function(imageData) {
      var image = document.getElementById('myImage');
      image.src = "data:image/jpeg;base64," + imageData;
    }, function(err) {
      // error
    });

  }, false);

答案 1 :(得分:2)

有趣的是,ngCordova ImagePicker没有将图片转换为base64的功能。但是,ngCordova $ cordovaCamera功能确实可用,但仅适用于立即拍摄的照片。

这里的等效选项是

 var options = {
  quality: 80,
  destinationType: Camera.DestinationType.DATA_URL,
  sourceType: Camera.PictureSourceType.CAMERA,
  allowEdit: true,
  encodingType: Camera.EncodingType.JPEG,
  targetWidth: 800,
  targetHeight: 800,
  popoverOptions: CameraPopoverOptions,
  saveToPhotoAlbum: false
};

来源:http://ngcordova.com/docs/plugins/camera/

答案 2 :(得分:1)

这是一个老问题,但我认为主要要求没有得到解答,尽管替代提案很好。 因此,只需指出遵循建议方式的方法,就可以使用此Base64 plugin

照常安装

cordova plugin add https://github.com/hazemhagrass/phonegap-base64

并在$cordovaImagePicker.getPictures成功回调

中使用它
$cordovaImagePicker.getPictures(options)
        .then(function (results) {
            for (var i = 0; i < results.length; i++) {
                console.log('Image URI: ' + results[i]);
                $scope.imageUri = results[i];

               // Encode URI to Base64
               window.plugins.Base64.encodeFile($scope.imageUri, function(base64){
                  // Save images in Base64
                  $scope.images.push(base64);
               });
            }

        }, function(error) {
            // error getting photos
        });

答案 3 :(得分:0)

如果您只是想要传输图片,那么您无法做到这一点。 您可以使用fileTransferPlugin。 希望这会帮助你。