【问题标题】:Cordova camera take picture as Blob objectCordova 相机将照片作为 Blob 对象
【发布时间】:2018-08-05 23:49:13
【问题描述】:

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

但是,destinationType 必须是 DATA_URLFILE_URI 之一。

文档状态:

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

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

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

我很难相信这比使用DATAURL 更有效。因此,我不妨为此使用DATAURL 并跳过步骤 1-3。

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

【问题讨论】:

    标签: cordova


    【解决方案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;
    }
    

    【讨论】:

    • 您能否详细说明sliceSize 的用途?
    猜你喜欢
    • 2015-02-02
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多