科尔多瓦相机拍照作为Blob对象

时间:2016-04-28 11:06:50

标签: cordova

我试图使用cordova-plugin-camera拍照。我希望结果是FileBlob对象。

但是,destinationType必须是DATA_URLFILE_URI中的一个。

文档声明:

  

DATAURL可能非常耗费内存,导致应用程序崩溃或内存不足错误。如果可能,请使用FILEURI或NATIVE_URI

但是,据我所知,将这样的文件uri转换为Blob会采取以下步骤:

  1. <img/
  2. 上渲染uri
  3. 在画布上绘制图像
  4. 将canvas作为base64阅读
  5. 将base64转换为Blob
  6. 我发现很难相信这比使用DATAURL更有效率。所以我也可以使用DATAURL来跳过步骤1-3。

    有没有办法以更有效的方式将照片作为Blob对象拍摄?

1 个答案:

答案 0 :(得分:1)

很遗憾,您无法从Cordova相机插件中提取BLOB

获取BLOB的方法是将base64编码的字符串转换为BLOB并使用它。

这是一种方法(符合ES6标准),允许您转换为BLOB,而 sliceSize 可以提高内存效率。

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