最近做项目的时候,需要做一个截图功能。用了一个别人写的截图工具,发现截出的 图质量下降了 ,但是我们图片要用来做识别, 需要保证截出的图质量不下降。而且也不支持通过拖动来调整截图框的大小。所以这个截图工具无法满足需求。因为所以,就自己动手写了一个截图组件。
下面介绍一下实现原理和使用方法。
组件 wxml 的层次结构图如下:
最后截图,通过四个点的位置计算出截图框的位置,然后放大对应原图大小的位置,得到在原图中的 (x, y, width, height) ,最后通过官方提供的 canvas 接口截图。
假设我们的应用文件结构如下:
调用组件时,需要传入 cropperData 、 cropperMovableItems 、 cropperChangableData ,因为数据和事件都是绑定在 Page 上的,所以要避免使用组件里面已经被占用的命名。
/pages/index/index.wxml
/pages/index/index.js
最后引入组件的样式
/pages/index/index.wxss
微信小程序裁剪组件,支持前端裁剪和后端裁剪两种方式
1.前端裁剪:将裁剪框指定的区域,单独生成图片,获取裁剪图片的临时文件路径
2.后端裁剪:获取裁剪框相对于原图的像素坐标位置,将裁剪区域坐标以及原图临时文件路径,传到后端进行图片裁剪
https://gitee.com/gnliscream/image-cropper
使用微信小程序自定义组件开发
小程序自定义组件官网: https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html
添加image-cropper标签,如下
可以在image-cropper标签内添加 *** 作按钮,如下
首先需要在onLoad方法中,设置裁剪标签属性
然后添加按钮相应的绑定方法
获取到的res如下
获取到的裁剪参数的对应关系图
获取到裁剪参数后,将原图以及裁剪参数传到后台进行裁剪
2.获取裁剪图片地址
获取到的res如下
微信截屏,微信小程序截屏调用教程一、程序简介:
本程序主要是用户1通过在相机上涂鸦来描绘物体的轮廓。然后,用户2根据轮廓寻找物体。如果成功则返回正确,否则返回继续努力。(具体开发流程和功能见微信小程序应用开发计划表。)
二、开发平台
微信开发者工具V1.02.1803210
三、进展
目前小程序的截图功能已经实现。后台识别也已经实现,同时正在完善数据库。
四、思路
想法一:
通过定位API获取用户位置,加上重力加速度或者罗盘来模拟实现。但想法一在实现的时候遇到如下问题被舍弃:
1)获取位置时使用误差不确定。(获取五次位置的平均值误差依然无法确定)
2)如果物体进行移动或同类物体无法识别。
想法二:
通过截取前后两个场景中包围轨迹的最大矩形,传输到后端进行识别。最后由后台返回结果
截屏实现大致过程:记录下用户的最大最小X、Y坐标->调用相机组件的takePhoto控件—>调用画布组件drawImage绘制图像到画布->根据最大最小X、Y坐标调用画布的canvasToTempFilePath导出图像。
遇到问题以及解决方案:
1. 在调用小程序的位置API时,发现获取5次平均值是0
原因:小程序的API有些是多线程的,因此在API后面的语句不一定后执行。
2. 画板无法覆盖到相机组件上:
原因:相机组件是源生组件,在上面只能覆盖cover-view和cover-image组件。
解决方法:画板也为源生组件,虽然按理来说可以覆盖。但是在页面首次加载中,相机会在画板的上面。第二次加载时,画布才可以覆盖到相机组建上面。因此,在开始界面调用一次相机,在第二界面就可以在上面覆盖画布了。
3. 在画布上调用drawImage绘制照片的部分图像时有问题。
原因:没找到
解决方案:将整张图绘制到画布中进行部分截取,这个在IOS系统中是可以的。在Android系统有问题。
4. 画布中导出图像中没有darwImage在画布上绘制的图。
原因:drawImage绘图需要时间。
解决方案:设置一个两秒的定时器。
5. 截图功能在安卓上可以运行,在IOS上无法点击
原因:微信在两个平台上采用的是不同的运行环境。在安卓上cover控件在画板上面,IOS中cover控件在画板下面。
解决方案:在相机控件的下方添加控件,同时调用drawImage时画板坐标乘上一个比例。(其画板坐标单位是像素)
6. 在API内用this指针发现无法给Page中数据赋值
原因:在部分API中,this指针可能不指向页面实例。
解决方法:先用that把this指针的值保存起来,在API内部用that。
7. 在函数中给page中的字符串和对象赋值时跳出函数范围,其值变为空
原因:这应该和程序执行的内存机制有关
解决方法:在给变量申请一个空间,如 str:new string()。之后赋值时问题便会解决。
8. 画板的drawImage绘制图形问题
原因:经过测试drawImage中的单位确实是像素。不过手机的像素为360*560,照片的像素却为720*1136。
解决方案:无
9. 程序的涂鸦和识别分为两个窗口后。识别窗口会显示轨迹,但背景却是黑色。
原因:不明
解决方案:在识别窗口第一次调用drawImage时,现调用一下clearfill()清空画布。
10. 记录轨迹
原因:前期我们是用点来描述用户的轨迹的,具体见边框绘制。但这样绘制出的点我们感觉贴的图不美观,之后想要改为用户自己绘制的轨迹
解决方案:在用户点击完成后先把用户的轨迹导入成一张透明图片,传入识别界面。然后贴在画板上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)