2016-04-28 190 views
5

我正在試圖用cordova-plugin-camera拍照。我希望結果是FileBlob對象。科爾多瓦照相機拍照爲斑點物體

但是,destinationType必須是DATA_URLFILE_URI之一。

的文檔狀態:

DATAURL可以是非常佔用大量內存,導致應用程序崩潰或內存不足的錯誤。使用了fileURI或NATIVE_URI如果可能的話

然而,據我所知,這樣的文件URI轉換成斑點採取下列步驟操作:

  1. 渲染的URI <img/
  2. 繪製圖像在畫布
  3. 讀帆布爲base64
  4. base64轉換到Blob

我覺得很難相信這比使用DATAURL更有效率。所以我也可以使用DATAURL來跳過步驟1-3。

有沒有辦法以更有效的方式拍攝一張作爲Blob對象的照片?

回答

0

不幸的是,您無法從Cordova相機插件中提取BLOB

獲得BLOB的方法是將base64編碼的字符串轉換爲BLOB並使用它。

下面是一個方法(符合ES6),允許您將BLOBsliceSize轉換爲更高的內存效率。

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