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

Rem*_*ing 5 cordova

我正在尝试拍照cordova-plugin-camera.我希望结果是一个File或一个Blob对象.

但是,destinationType必须是DATA_URL或之一FILE_URI.

文档说明:

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

但是,据我所知,将这样的文件uri转换为Blob需要执行以下步骤:

  1. 在uri上渲染uri <img/
  2. 在画布上绘制图像
  3. 将canvas作为base64读取
  4. 将base64转换为 Blob

我发现很难相信这比使用效率更高DATAURL.所以我也可以使用DATAURL它并跳过步骤1-3.

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

0x1*_*ad2 3

不幸的是,您无法BLOB从 Cordova 相机插件中提取 a。

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

这里有一个方法(符合 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;
}
Run Code Online (Sandbox Code Playgroud)