2016-04-28 189 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; 
}