2016-04-28 19 views
5

Sto provando a scattare una foto utilizzando cordova-plugin-camera. Mi piacerebbe che il risultato fosse un oggetto File o Blob.La videocamera Cordova scatta la foto come oggetto Blob

Tuttavia, lo destinationType deve essere uno di DATA_URL o FILE_URI.

Lo stato documenti:

DataURL può essere molto intensivo di memoria e causare crash app o errori di memoria. Utilizzare fileURI o NATIVE_URI se possibile

Tuttavia, per quanto posso dire, la conversione di un file URI a un Blob prende questi passaggi:

  1. rendendo l'uri un'immagine <img/
  2. Draw su su una tela
  3. Leggi tela come Base64
  4. Converti Base64 per Blob

Trovo difficile credere che questo sia più efficiente dell'uso di DATAURL. Quindi potrei anche usare DATAURL per questo e saltare i passaggi 1-3.

C'è un modo per ottenere un'immagine in modo più efficiente come un oggetto Blob?

risposta

0

Purtroppo, non è possibile estrarre uno BLOB dal plug-in della telecamera Cordova.

Il modo per ottenere un BLOB consiste nel convertire la stringa codificata base64 in un BLOB e utilizzarlo.

Ecco un metodo (conforme a ES6) che consente di convertire in BLOB e solo lo sliceSize per aumentare la memoria.

/** 
* Turn base 64 image into a blob, so we can send it using multipart/form-data posts 
* @param b64Data 
* @param contentType 
* @param sliceSize 
* @return {Blob} 
*/ 
private getBlob(b64Data:string, contentType:string, sliceSize:number= 512) { 
    contentType = contentType || ''; 
    sliceSize = sliceSize || 512; 

    let byteCharacters = atob(b64Data); 
    let byteArrays = []; 

    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { 
     let slice = byteCharacters.slice(offset, offset + sliceSize); 

     let byteNumbers = new Array(slice.length); 
     for (let i = 0; i < slice.length; i++) { 
      byteNumbers[i] = slice.charCodeAt(i); 
     } 

     let byteArray = new Uint8Array(byteNumbers); 

     byteArrays.push(byteArray); 
    } 

    let blob = new Blob(byteArrays, {type: contentType}); 
    return blob; 
} 
Problemi correlati