位置: IT常识 - 正文

canvas实现图片标记(canvas实现图片编辑)

编辑:rootadmin
前言 由于业务需求,需要有一个图片标记功能,其实就是对图片画框画线做标记,类似微信的图片编辑 但是需要存下标记图及其标记的具体数据,。功能其实很简单,但刚开始的时候也是费了一些功夫的。我将原项目中该功能抽离出来单独写了一个demo,作为记录,同时你们在开发过程中有类似需求的话也可以参考一下该思路,其 ... 前言

推荐整理分享canvas实现图片标记(canvas实现图片编辑),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:canvas图表,canvas绘制图片的方法,canvas在图片上绘制图形,canvas图表,canvas在图片上绘制图形,canvas实现图片标注,canvas实现图片标注,canvas显示图片,内容如对您有帮助,希望把文章链接给更多的朋友!

由于业务需求,需要有一个图片标记功能,其实就是对图片画框画线做标记,类似微信的图片编辑但是需要存下标记图及其标记的具体数据,。功能其实很简单,但刚开始的时候也是费了一些功夫的。我将原项目中该功能抽离出来单独写了一个demo,作为记录,同时你们在开发过程中有类似需求的话也可以参考一下该思路,其中有不足之处还请指出来。

实现目标canvas实现图片标记(canvas实现图片编辑)

1、定点缩放。2、图片拖拽。3、图片中绘制点、直线、矩形、圆形、多边形。4、上传原图。5、下载标注图。6、记录标记数据。

具体效果

这是在线浏览地址。这是源码地址。

实现思路

项目是纯原生canvas实现的,没使用任何其他插件。由于canvas没有图层的概念,实现切换不同的绘制模式时有一点麻烦。具体方案是:分别单独存下每次绘制的数据,再将该数据添加到一个大列表中(如下图中的canvasData),每次绘制图形时都需要重绘该大列表,若需要操作绘制的图形,则变动大列表中对应的数据后重绘即可。

具体逻辑

1、绑定事件。先添加画布canvas,并指定画布尺寸与绑定各种事件:滚轮事件(mousewheel)、右键事件(contextmenu)、鼠标按下事件(mousedown)、鼠标松开事件(mouseup)、鼠标移动事件(mousemove)、双击事件(dblclick)。2、绘制模式。该功能有五种绘图模式:点模式、直线模式、矩形模式、多边形模式、圆形模式。点模式最简单,在鼠标松开事件中绘制点,然后获取到坐标,最后将数据添加到大列表中。其中canvas绘制点的方法如下,其实就是利用ctx.arc绘制一个实心圆,arc四个参数分别为圆心坐标x、y、半径、起始角度、终止角度。直线模式的绘制是在鼠标移动事件中,移动时不停的调用ctx.clearRect清除绘制的图形,然后再不停的绘制大列表的数据,鼠标松开后将再将直线绘图数据添加到大列表中,从而实现拖拽画线的效果。canvas绘制直线的方法如下,其中最主要的便是ctx.lineTo方法。矩形模式的绘制与直线绘制一样,也是放在鼠标移动事件中的。拖拽即可绘制出矩形。具体canvas绘制矩形的方法如下,其中ctx.strokeRect方法四个参数分别为矩形左上角的x、y坐标,矩形长度、矩形宽度。多边形绘制模式比较麻烦一点。我设计的操作模式是,右键依次点击多边形的顶点,最后需要闭合时双击左键即可完成绘制,闭合多边形,将多边形数据添加到大列表中。这样只需判断每次点击绘制时是否闭合即可,双击事件处理如下。圆形模式绘制的绘制与点的绘制类似,也是使用ctx.arc。不同的是圆需要计算半径,在鼠标松开的一瞬间记录下坐标,使用该坐标平方后再开根即可计算出半径。具体绘制方法如下。

3、定点缩放。需要保证鼠标中心位置与图片比例不能改变,该功能是绑定鼠标滚动事件的,每次缩放时需要重新计算比例与坐标,重绘大列表的数据,这是滚动事件的处理,需要注意事件中wheelDelta值的正负。这是改变画布的方法,画布尺寸是通过缩放倍数与原图尺寸控制的,画布位置是通过旧位置加偏移量来控制的。需要限制缩放倍数的话控制maxZoom与minZoon即可。4、图片拖拽。该功能的实现则比较简单,点击左键后打开限制拖拽的状态,记录拖拽偏移量。鼠标移动时,实时改变画布的top与left即可(这里是通过position: absolute;定位的)。5、上传原图。这里的上传并不是上传到服务器中,而是利用input type="file"选取文件到浏览器中处理,需要限制为只选取图片,使用accept="image/jpeg"属性。其中上传的方法如下,需要限制文件大小,然后通过createObjectURL获取到url(该url比较特殊,只在当前dom页面中有效)。最后通过loadBgImg方法返回一个img,页面中即可使用该图片,从而实现“上传”。6、下载标注图。值得注意的是为防止标记错位,需要下载前需要将图片尺寸位置还原,然后再获取页面中canvas的DOM,然后通过toDataURL获取到base64。将该base64生成转化为Blob,然后创建事件,使用a标签下载,路径仍然使用createObjectURL获取。7、记录标记数据。记录标记数据的好处是,将来若需要单独编辑每个标记,则可以直接改变记录下的数据,然后重绘该数据即可。记录数据的逻辑是写在鼠标松开事件中的,每次绘制完标记后都需要将绘图数据push到大列表中。

结语

在开发过程中我还是踩了很多坑的,文章中记录的只是很少的一部分。还是建议看文章开头的项目源码链接,源码中我写了大量详细的注释。

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

上一篇:vue如何给组件动态绑定不同的事件(vue移动组件)

下一篇:织梦DEDECMS修改模板默认扩展名为.html的教程(织梦系统如何更换网站内容)

  • 芒果tv怎么关闭自动续费安卓手机(芒果tv怎么关闭会员自动续费)

    芒果tv怎么关闭自动续费安卓手机(芒果tv怎么关闭会员自动续费)

  • 支付宝打开免密支付的步骤是什么(支付宝免密设置在哪里)

    支付宝打开免密支付的步骤是什么(支付宝免密设置在哪里)

  • 华为荣耀20用的什么屏幕(华为荣耀20用的什么系统)

    华为荣耀20用的什么屏幕(华为荣耀20用的什么系统)

  • 接收短信会产生费用吗(接收短信有费用吗)

    接收短信会产生费用吗(接收短信有费用吗)

  • 微信怎么弄精选商品橱窗(微信精选头像图片)

    微信怎么弄精选商品橱窗(微信精选头像图片)

  • 小米6充电口松动碰一下就断电(小米充电口松了怎么可以让它变紧)

    小米6充电口松动碰一下就断电(小米充电口松了怎么可以让它变紧)

  • 华为fla al10是什么型号手机(华为FLAAL10是什么型号)

    华为fla al10是什么型号手机(华为FLAAL10是什么型号)

  • 开启数据漫游是什么意思(开启数据漫游会提高网速吗)

    开启数据漫游是什么意思(开启数据漫游会提高网速吗)

  • ipad中间有个圆圈(苹果ipad中间那个圆点怎么设置)

    ipad中间有个圆圈(苹果ipad中间那个圆点怎么设置)

  • iphone充电头是多少w(iphone充电头)

    iphone充电头是多少w(iphone充电头)

  • 苹果7能用18w快充吗(苹果7支持18wpd快充吗)

    苹果7能用18w快充吗(苹果7支持18wpd快充吗)

  • 支付宝获取手机定位服务的权限在哪里(支付宝获取手机定位服务的权限在哪里设置)

    支付宝获取手机定位服务的权限在哪里(支付宝获取手机定位服务的权限在哪里设置)

  • 分页符是干嘛用的(分页符是用来干什么的)

    分页符是干嘛用的(分页符是用来干什么的)

  • xsmax美版是双卡嘛(xsmax美版是双卡吗)

    xsmax美版是双卡嘛(xsmax美版是双卡吗)

  • 如何把word设置16开(如何把word设置为豆沙绿)

    如何把word设置16开(如何把word设置为豆沙绿)

  • 苹果13系统短信有个叹号(苹果13系统短信叹号怎么取消)

    苹果13系统短信有个叹号(苹果13系统短信叹号怎么取消)

  • 悦作业怎么看不了答案(悦作业app)

    悦作业怎么看不了答案(悦作业app)

  • 华为nova4容易发热吗(华为nova4很容易发烫)

    华为nova4容易发热吗(华为nova4很容易发烫)

  • 小米6连不上wifi(小米6连不上wifi怎么办)

    小米6连不上wifi(小米6连不上wifi怎么办)

  • ai怎么加阴影(ai怎么加阴影和高光)

    ai怎么加阴影(ai怎么加阴影和高光)

  • 手机imei码有什么用(手机imei码规则)

    手机imei码有什么用(手机imei码规则)

  • 淘宝短视频制作方法有哪些(淘宝短视频制作及上传)

    淘宝短视频制作方法有哪些(淘宝短视频制作及上传)

  • word画图笔在哪里(word如何用画笔画图)

    word画图笔在哪里(word如何用画笔画图)

  • Linux下面使用命令如何运行.sh文件的两种解决办法(linux命令使用)

    Linux下面使用命令如何运行.sh文件的两种解决办法(linux命令使用)

  • 端午假期整理了仿天猫H5 APP项目vue.js+express+mongo(端午假期干什么)

    端午假期整理了仿天猫H5 APP项目vue.js+express+mongo(端午假期干什么)

  • 【TypeScript】TS进阶-函数重载(七)(typescript tsconfig)

    【TypeScript】TS进阶-函数重载(七)(typescript tsconfig)

  • python random中的随机函数(python random random)

    python random中的随机函数(python random random)

  • 山东税务网上申报平台操作员查询
  • 一般纳税人增值税税率
  • 先发表还是先出版
  • 买手机手续费怎么算
  • 油票发票怎么查真伪
  • 建筑企业异地申报个税
  • 工资代扣工会会费
  • 开票个人账户的钱怎么查
  • 租房违约金怎么计算,怎么写
  • 跨区域经营企业
  • 非独立核算的分公司是法人主体吗
  • 企业劳务发票怎么开,税率是多少
  • 合同期限3年
  • 小规模纳税人如何转一般纳税人
  • 上个月有留抵税这个月怎么结转税金
  • 无票收入有哪些情况抖音
  • 专用发票的有效期是几年
  • 研发支出与开发成本的区别
  • 企业所得税零申报资产总额怎么填
  • 调整以前年度的库存
  • 可供出售金融资产是指什么
  • 公司地址变更代办需要多少钱
  • 资源税计税依据含不含增值税
  • 或有事项基本确定
  • 冲减多计提税费
  • 开办费计入长期待摊费用汇算清缴时怎么填写
  • php使用js
  • 命令行wifi
  • 销售已使用固定资产收入与主营收入合计超过120万元
  • 企业所得税年度预缴的算法
  • 登记会计账簿的注意事项
  • vue-html
  • 新公司30天内未办理税务登记
  • 克鲁格国家公园大雄狮视频大全
  • 资产提前报废需要什么资料
  • 无形资产期末余额在哪方
  • 土地使用税计入管理费用还是税金及附加
  • 位于阿曼和迪拜的大学
  • 天猫提现到对公账户怎么做账
  • 应收账款与预收账款重分类表怎么做
  • 自然人税收管理系统
  • 固定资产处置营业外支出
  • linux lab安装
  • 织梦如何采集文章
  • jdbc描述
  • 应付利息怎么计算
  • 借贷记账法的记账规则是
  • 房地产企业印花税计入什么科目
  • 应付账款主要账户有哪些
  • 月销售额10万以下一般纳税人免征增值税
  • 建筑行业小规模纳税人和一般纳税人
  • 营改增试点行业顺序
  • 现金流量表中应收账款为负是什么意思
  • 企业所得税弥补亏损可以弥补几年
  • 银行贷款损失的计算公式
  • 生产用品采购怎么购买的
  • 结转完工入库产品成本的会计分录
  • 疫情期间购买消毒弥雾机的请示
  • 酒店房间消耗品成本
  • 报销需要发票吗?
  • 租房开的发票收的税如何做账?
  • 应用《企业会计》的论文
  • 明细分类账怎么做表格
  • sql树结构
  • debian和ubuntu命令一样吗
  • freebsd操作命令
  • 删除微软
  • macbook恢复macos
  • mac电脑登录
  • Extjs4.0 ComboBox如何实现三级联动
  • linux rpm解压
  • iframe嵌入页面出现跨域问题
  • 深入理解新发展理念,推进供给侧结构性改革
  • shell脚本wc
  • jQuery+ajax简单实现文件上传的方法
  • android中fragment
  • 如何打印个人所得税的税单
  • 实际金额与报关金额不符
  • 北京身份证网上换证流程
  • 北京市停车发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设