Cordova图像选择器转换为Base64

5

我在使用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个回答

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);

这个很好用,我认为应该是正确的答案。 - David

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
};

Source: http://ngcordova.com/docs/plugins/camera/


1
这是一个旧问题,但我认为主要请求尚未得到回答,尽管替代方案很好。因此,只需指出一种遵循建议方式的方法,您可以使用此Base64插件
像往常一样安装它。
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
        });

好的建议..尝试过了但是没有起作用..我正在使用Cordova v6 - runtimeZero

0

如果你只是想将图像传输到服务器,你还没有做到这一点。 你可以使用fileTransferPlugin。 希望这能帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接