位置: 编程技术 - 正文

基于Vue的移动端图片裁剪组件功能(vue做移动端)

编辑:rootadmin

推荐整理分享基于Vue的移动端图片裁剪组件功能(vue做移动端),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue移动端案例,vue如何做移动端适配,vue做移动端适配最佳解决方案,亲测有效,vue3移动端,vue做移动端,vue移动端项目实例,基于vue的移动端ui框架,基于vue的移动端框架,内容如对您有帮助,希望把文章链接给更多的朋友!

最近项目上要做一个车牌识别的功能。本来以为很简单,只需要将图片扔给后台就可以了,但是经测试后识别率只有-%。因此产品建议拍摄图片后,可以对图片进行拖拽和缩放,然后裁剪车牌部分上传给后台来提高识别率。刚开始的话还是百度了一下看看有没有现成的组件,但是找来找去都没有找到一个合适的,还好这个功能不是很着急,因此自己周末就在家里研究一下。

  Demo地址:  下载地址:  因为移动端是用vue,所以就写成了一个vue组件,下面就说说自己的一些实现思路(本人技术有限,各位大神请体谅。另外展示的代码不一定是某个功能的完整代码),先看看效果: 

 

  一、组件的初始化参数

  1、图片img(url或者base data-url)

  2、截图的宽clipperImgWidth

  3、截图的高clipperImgHeight

  二、布局

  在Z轴方向看主要是由4层组成。第1层是一个占满整个容器的canvas(称cCanvas);第2层是一个有透明度的遮罩层;第3层是裁剪的区域(示例图中的白色方框),里面包含一个与裁剪区域大小相等的canvas(称pCanvas);第4层是一个透明层gesture-mask,用作绑定touchstart,touchmove,touchend事件。其中两个canvas都会加载同一张图片,只是起始坐标不一样。为什么需要两个canvas?因为想做出当手指离开屏幕时,裁剪区域外的部分表面会有一个遮罩层的效果,这样能突出裁剪区域的内容。

  三、初始化canvas

  canvas绘制的图片在hdpi显示屏上会出现模糊,具体原因这里不作分析,可以参考下这里。我这里的做法是让canvas的width与height为其css width/height的devicePixelRatio倍,以及调用canvas api时所传入的参数都要乘以window.devicePixelRatio。最后还要记录一下两个canvas坐标原点的x, y差值(originXDiff与originYDiff)。如下

  四、加载图片

  加载图片比较简单,首先是创建一个Image对象并监听器onload事件(因为加载的图片有可能是跨域的,因此要设置其crossOrigin属性为Anonymous,然后服务器上要设置Access-Control-Allow-Origin响应头)。加载的图片如果宽高大于容器的宽高,要对其进行缩小处理。最后垂直水平居中显示()(这里注意的是要保存图片绘制前的宽高值,因为日后缩放图片是以该值为基础再乘以缩放倍率,这里取imgStartWidth,imgStartHeight)如下

   五、绘制图片

  下面的_drawImage有四个参数,分别是图片对应cCanvas的x,y坐标以及图片目前的宽高w,h。函数首先会清空两个canvas的内容,方法是重新设置canvas的宽高。然后更新组件实例中对应的值,最后再调用两个canvas的drawImage去绘制图片。对于pCanvas来说,其绘制的图片坐标值为x,y减去对应的originXDiff与originYDiff(其实相当于切换坐标系显示而已,因此只需要减去两个坐标系原点的x,y差值即可)。看看代码

   六、移动图片

  移动图片实现非常简单,首先给gesture-mask绑定touchstart,touchmove,touchend事件,下面分别介绍这三个事件的内容

  首先定义四个变量scx, scy(手指的起始坐标),iX,iY(图片目前的坐标,相对于cCanvas)。

基于Vue的移动端图片裁剪组件功能(vue做移动端)

  1、touchstart

    方法很简单,就是获取touches[0]的pageX,pageY来更新scx与scy以及更新iX与iY

  2、touchmove

    获取touches[0]的pageX,声明变量f1x存放,移动后的x坐标等于iX + f1x - scx,y坐标同理,最后调用_drawImage来更新图片。

  看看代码吧

   七、缩放图片(这里不作特别说明的坐标都是相对于cCanvas坐标系)

  绘制缩放后的图片无非需要4个参数,缩放后图片左上角的坐标以及宽高。求宽高相对好办,宽高等于imgStartWidth * 缩放比率与imgstartHeight * 缩放倍率(imgStartWidth ,imgstartHeight 上文第四节有提到)。接下来就是求缩放倍率的问题了,首先在touchstart事件上求取两手指间的距离d1;然后在touchmove事件上继续求取两手指间的距离d2,当前缩放倍率= 初始缩放倍率 + (d2-d1) / 步长(例如每px算0.1),touchend事件上让初始缩放倍率=当前缩放倍率。

  至于如何求取缩放后图片左上角的坐标值,在草稿纸上画来画去,画了很久......终于有点眉目。首先要找到一个缩放中心(这里做法是取双指的中点坐标,但是这个坐标必须要位于图片上,如果不在图片上,则取图片上离该中点坐标最近的点),然后存在下面这个等式

  (缩放中心x坐标 - 缩放后图片左上角x坐标)/ 缩放后图片的宽度 = (缩放中心x坐标 - 缩放前图片左上角x坐标)/ 缩放前图片的宽度;(y坐标同理)

  接下来看看下面这个例子(在visio找了很久都没有画坐标系的功能,所以只能手工画了)

  

  绿色框是一张*5的图片,蓝色框是宽高放大两倍后的图片*,根据上面的公式推算的x2 = sx - w2(sx - x1) / w1,y2 = sy - h2(sy - y1) / h1。

  坚持...继续看看代码吧

  说明一下fingers是干嘛的,是用来记录当前有多少只手指在屏幕上触摸。可能会出现这种情况,双指缩放后,其中一只手指移出显示屏,而另外一个手指在显示屏上移动。针对这种情况,要在touchend事件上根据e.changedTouches来移除fingers里已经离开显示屏的finger,如果此时fingers里只剩下一个finger,则更新scx,scy,iX,iY为移动图片做初始化准备。

  八、裁剪图片

  这里很简单,就调用pCanvas的toDataURL方法就可以了

  总结

  上面只是列出了一些自己认为比较关键的点, 如果有兴趣的,可以到我的github上下载源码看看。

以上所述是小编给大家介绍的基于Vue的移动端图片裁剪组件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对积木网网站的支持!

基于vue2实现上拉加载功能 本文实例为大家分享了vue2实现上拉加载展示的具体代码,供大家参考,具体内容如下因为我们项目中,还用了swiper。很多都是滑动切换的,但是又得上

Vue2仿淘宝实现省市区三级联动 三级联动,随着越来越多的审美,出现了很多种,好多公司都仿着淘宝的三级联动,好看时尚,so我们公司也一样……为了贴代码方便,我把写在data里

vue2实现数据请求显示loading图 一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失。这个,一般只需要在封装的axios中写入js事件即可。当然

标签: vue做移动端

本文链接地址:https://www.jiuchutong.com/biancheng/378916.html 转载请保留说明!

上一篇:基于Vue框架vux组件库实现上拉刷新功能(基于vue的ui框架)

下一篇:基于vue2实现上拉加载功能(vue2.x)

  • 计算本月应交所得税
  • 土增清算问题
  • 交易性金融资产公允价值变动计入
  • 个体户一定要自己经营吗
  • 广告制作可以开什么发票
  • 明细分类核算的方法分为
  • 快消品行业成本结转方法
  • 生物性资产折旧吗
  • 公司清算后资产负债表与利润表
  • 视同销售收入计入会计利润吗
  • 长期股权投资权益法下初始投资成本
  • 申请专利的费用如何入账
  • 现金日记账支出是记借还是贷
  • 固定资产一次性扣除政策2023
  • 周转材料低值易耗品
  • 增值税发票过期了税金怎么办
  • 金税是干什么的
  • 研发和技术服务在开票软件中怎么找
  • 固定资产加速折旧最新政策2023
  • 联营企业分回的利润交企业所得税吗
  • 电子发票怎么打成A4纸一半
  • 房地产中介公司排名
  • 清理血管垃圾最有效的食物
  • 如何保护excel表格不被打开
  • 多结转成本会导致什么
  • 企业合并中或有负债确认后期调整的项目
  • 安装win7系统的硬件要求
  • 应收账款与主营业务收入的比率
  • php的字符串函数
  • 支付费用没有发票怎么做账务处理
  • 汇算清缴后补缴企业所得税账务处理
  • php字段
  • 生产设备改良支出计入什么费用
  • 固定资产相关会计准则
  • 总分账与明细账关系
  • 悬崖雕塑
  • uniapp前端面试题
  • 利息收入做红字
  • phptime函数
  • python 虚拟环境
  • python 如何
  • 建筑行业预缴个税怎么算
  • 织梦标签理解
  • 浅谈php设计模式的理解
  • 企业建造的厂房属于固定成本吗
  • 怎么把其他应收款借方余额转出
  • 企业注销库存怎么处理
  • d级企业预缴增值税如何申报
  • 系统带我玩隐形守护者 小说
  • 白酒消费税最低计税价格核定范围包括
  • 淘宝上买资料可以退吗
  • 政府部门城投公司融资安全吗
  • 社保小微企业优惠政策
  • 教育培训机构的老师可以评职称吗
  • 资源税的账务处理
  • 公司员工机票可以抵扣多少呢
  • 利润相关计算公式是什么
  • 本月取得的发票入账后次月对方能红冲吗
  • 发生的费用
  • 税局代开的法律顾问费能否抵扣?
  • 工程开票金额大写怎么写
  • 工资油补也要交税吗
  • 银行回单中借贷表示什么意思
  • 编制合并报表时最关键的一步
  • 个体工商户个税2023最新政策
  • mysql 创建root用户和普通用户及修改删除功能
  • win7系统出现蓝屏怎么进去桌面
  • centos怎么设置密码
  • python sed
  • win7显示网上邻居图标
  • glibc2.14安装
  • 列举css的三种应用方式
  • linux中使用bash是什么意思
  • 文本框css关闭输入框
  • jquery模拟表单提交
  • unity shader lerp
  • linux shell 技巧
  • android图库
  • 怎样查询退休审核表
  • 新车怎么上深圳牌
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设