2013-01-11 15 views
5

Próbuję zakodować obraz na base64 i wysłać go na serwer. Po pobraniu obrazu wszystkie jego pokazy są puste.Kodowanie obrazu bazowego Phonegap64

Kod używam go do kodowania to:

encodeImageUri = function(imageUri) { 
     var c = document.createElement('canvas'); 
     var ctx = c.getContext("2d"); 
     var img = new Image(); 
     img.onload = function() { 
      c.width = this.width; 
      c.height = this.height; 
      ctx.drawImage(img, 0, 0); 
     }; 
     img.src = imageUri; 
     var dataURL = c.toDataURL("image/jpeg"); 

     return dataURL.slice(22, dataURL.length); 
    } 

albumu: Using PhoneGap, How to get base64 image data of the photo chosen from photo library in iPhone

Odpowiedz

2

Obraz jest ładowanie asynchronicznie, co oznacza, że ​​return dataURL... dzieje przed obraz jest załadowany do płótna.

Zamiast funkcji zwracania wartości, wywołaj funkcję zwrotną.

encodeImageUri = function(imageUri, callback) { 
    var c = document.createElement('canvas'); 
    var ctx = c.getContext("2d"); 
    var img = new Image(); 
    img.onload = function() { 
     c.width = this.width; 
     c.height = this.height; 
     ctx.drawImage(img, 0, 0); 

     if(typeof callback === 'function'){ 
      var dataURL = c.toDataURL("image/jpeg"); 
      callback(dataURL.slice(22, dataURL.length)); 
     } 
    }; 
    img.src = imageUri; 
} 

teraz nazwać tak:

encodeImageUri('/path/to/image.png', function(base64){ 
    // Do something with the b64'd image 
}); 

UWAGA: Aby to zadziałało, obraz musi być w tej samej domenie co strony.

+0

Nadal nie działa, otrzymuję ciąg z kilkoma literami A: –

+0

@ danielrvt-sgb: Czy obraz jest w tej samej domenie co twoja strona? Jesteś pewien, że ciąg znaków jest nieprawidłowy? –

+0

Zdjęcie zostało wykonane aparatem telefonu i zapisane na karcie SD. Przetestowałem ciąg na tej stronie: http://www.freeformatter.com/base64-encoder.html i zwraca pusty obraz –

2

Użyj metody readAsDataURL z FileReader.

+0

Jak korzystać z readAsDataUrl, jeśli nie ma dokumentacji dotyczącej tworzenia wystąpień obiektów FileEntry? –

+0

Przeniesie obrazURI i przekazuje go do window.resloveLocalFileSystemURI, który będzie miał obiekt FileEntry jako parametr wywołania zwrotnego sukcesu. Wtedy będziesz mógł użyć FileReader do odczytu tego FileEntry. –

+0

Otrzymuję, że resloveLocalFileSystemURI jest niezdefiniowany –

3

używam następujący kod do konwersji obrazu do Base64:

var Base64 = { 
    /** 
    * This implementation relies on Cordova 1.5 or above implementations. 
    */ 
    getBase64ImageFromInput : function (input, callback) { 
     var imageReader = new FileReader(); 
     imageReader.onloadend = function (evt) { 
      if (callback) 
       callback(evt.target.result); 
     }; 
     //Start the asynchronous data read. 
     imageReader.readAsDataURL(input); 
    }, 
    formatImageSrcString : function (base64) { 
     return (base64.match(/(base64)/))? base64 : "data:image/jpeg;base64," + base64; 
    } 
}; 

Poniżej znajduje się przykład korzystania z tego obiektu do konwersji obrazu z wejścia plików do kodowania base64:

var fileInput = document.createElement('input'); 
fileInput.type = 'file'; 
fileInput.onchange = function() { 
    var input = this.files[0]; 
    if (input) { 
     Base64.getBase64ImageFromInput(input, function (imageData) { 
      //Process the image string. 
      console.log(imageData); 
     }); 
    } else { 
     alert("Please select an image."); 
    } 
}; 

Nadzieja to pomaga. Daj mi znać, jeśli masz jakieś pytania.

Powiązane problemy