Vue+cordova camera插件采用dataurl格式导致内存问题的解决方案
来源:互联网 发布:matlab怎么调用caffe 编辑:程序博客网 时间:2024/06/06 09:08
一、之前文章中有介绍Vue进行项目开发需要进行图片上传的时候,直接采用input调用相机,在有些安卓设备上会只显示图库,不能调取相机的情况
具体采用input调取相机的代码如下
<input type="file" accept="image/*" capture="camera"><input type="file" accept="video/*" capture="camcorder"><input type="file" accept="audio/*" capture="microphone">其中,capture表示可以捕获到系统默认的设备,camera-相机,camcorder-摄像机,microphone-录音,accept表示直接打开系统文件目录。
二、因此结合之后采用了cordova进行打包,可以采用cordova-plugin-camrea插件,调取相机进行拍照或者采用图库选取照片。
在之前的文章中,destinationType采用dataurl的形式,返回base64格式编码的字符串,这种之后可以进行转换为blob,在append到formdata上传到阿里云(具体的操作在前文中介绍过),但是这种方式存在着一个弊端,就是采用base64存储的格式的话,会导致内存问题,官方文档里是这样说的
DATAURL can be very memory intensive and cause app crashes or out of memory errors. Use FILEURI or NATIVE_URI if possible
三、因此,本文将要使用fileuri来完成之前的拍照,图片获取及上传的功能
解决方案就是采用canvas,将img绘制到canvas上,再通过canvas转换为file,进行上传。
代码示例如下
var canvas = document.createElement('canvas')var ctx = canvas.getContext('2d')var img = document.getElementById(‘imgId’)img.onload = function () { canvas.width = img.width canvas.height = img.height ctx.drawImage(img, 0, 0, img.width, img.height) var dataURL = canvas.toDataURL('image/jpeg', 0.5) var dataArray = dataURL.split(',') var blob = b64toBlob(dataArray[1], 'image/jpeg') .... //此处省略将blob作为file,append到formdata并上传到服务器上的代码 .... img.onload = null}img.src = imageURI
代码里第一行创建canvas。第二行获取上下文,这个对象提供对其绘图等的方法。
第三行获取要显示的图片的id,值得注意的是img的onload函数要放在img.src赋值之前,此外,在onload函数的执行完毕之后要将其置为null,这样避免重复调用。
还要注意的当canvas的width和height为空的话返回的dataURL是'data:,'形式的。
此处还使用来一个插件来完成base64到blob的转换,但是这个函数的参数是不带base64头的字符串,所以中间进行了格式转化,最后转化的blob即可作为file进行上传。
一些小问题
1、在调用的时候this的绑定问题,由于在img.onload里面用到了this,但是此时的this不是所要用到的作用域,因此,在img.onload外面,采用
var that = this
形式来将this传递给that,在img.onload里,使用that即可访问到原this作用域里的变量和函数。
2、之前采用了canvas.toblob方法来直接将canvas转化为blob,但是存在的问题是有些手机不支持这个方法,也采用了JavaScript-Canvas-to-Blob插件来解决兼容性的问题,但是没有得到很好的解决,最后采用canvas.toDataUrl得到解决.也有相关的帖子讨论toBlob和toDataUrl的利弊,参见[8]
至此,可以采用fileuri完成图片的上传。
参考网址
[1] http://qyf0310.blog.51cto.com/1875017/1876152
[2] http://www.cnblogs.com/xuechenlei/p/5940371.html
[3] http://cordova.axuer.com/docs/zh-cn/latest/reference/cordova-plugin-camera/index.html
[4] https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toBlob
[5] https://segmentfault.com/q/1010000008711634
[6] https://github.com/blueimp/JavaScript-Canvas-to-Blob
[7] http://blog.csdn.net/cool_coder/article/details/43193851
[8] https://www.zhihu.com/question/59267048/answer/164201665
- Vue+cordova camera插件采用dataurl格式导致内存问题的解决方案
- cordova的camera插件,IOS下图片旋转问题
- Vue.js 使用cordova camera插件调取相机
- ionic添加cordova插件-Camera
- cordova学习笔记_cordova插件的使用(camera)
- Xcode更新或者重新安装导致插件无效问题的解决方案
- 图片转化DataURL格式
- 使用Cordova进行iOS开发 (第三方插件的使用:Camera插件)
- cordova camera插件——摄像头插件的使用及上传图片
- cordova camera插件 问题之一 html里面写了button click 失效
- ionic工程引入cordova plugin camera 插件编译报错问题总结
- 【cordova】cordova热更新插件的问题(cordova-hot-code-push)
- Android Handler导致内存泄漏的解决方案
- cordova camera
- IOS的ARC会导致的内存泄露问题和解决方案
- cordova 插件的使用说明
- 关于cordova的InAppBrowser插件的几点问题
- 关于Android的Cordova插件plugin OnActivityResult无效的问题
- webapp实现蓝牙串口通讯
- 关于MacOS升级10.13系统eclipse菜单灰色无法使用解决方案
- pat 1099
- hdu 2586 How far away? LCA 解题报告
- 最短路 (floyed)
- Vue+cordova camera插件采用dataurl格式导致内存问题的解决方案
- 字符串next函数求值
- 使用Spring + quartz集群持久化时注意事项
- I/O流 基础知识点
- CAN总线基础(一)——CAN总线概述
- 指针
- Android之Fragment
- 【BZOJ】1875 [SDOI2009]HH去散步 DP+矩阵优化
- 【译】Scheduling Tasks