Cordova相机拍摄照片作为Blob对象

6

我正在尝试使用 cordova-plugin-camera 拍摄照片。我希望结果是一个 File 或者 Blob 对象。

然而,destinationType 必须是 DATA_URL 或者 FILE_URI 中的一个。

文档中指出:

DATA_URL 可能会占用大量内存,导致应用程序崩溃或内存不足错误。如果可能,请使用 FILE_URI 或 NATIVE_URI。

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

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

我认为这不会比使用 DATA_URL 更有效率。因此,对于此操作,我可能会直接使用 DATA_URL 并跳过步骤 1-3。

有没有更有效率的方法来获取以 Blob 对象形式拍摄的图片?

1个回答

3

很遗憾,你无法从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;
}

请问能否详细介绍一下 sliceSize 是什么意思? - Daniel Birowsky Popeski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接