科尔多瓦照相机拍照为斑点物体
问题描述:
我正在试图用cordova-plugin-camera
拍照。我希望结果是File
或Blob
对象。科尔多瓦照相机拍照为斑点物体
但是,destinationType
必须是DATA_URL
或FILE_URI
之一。
的文档状态:
DATAURL可以是非常占用大量内存,导致应用程序崩溃或内存不足的错误。使用了fileURI或NATIVE_URI如果可能的话
然而,据我所知,这样的文件URI转换成斑点采取下列步骤操作:
- 渲染的URI
<img/
- 绘制图像在画布
- 读帆布为base64
- base64转换到
Blob
我觉得很难相信这比使用DATAURL
更有效率。所以我也可以使用DATAURL
来跳过步骤1-3。
有没有办法以更有效的方式拍摄一张作为Blob
对象的照片?
答
不幸的是,您无法从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;
}