位置: 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的教程(织梦系统如何更换网站内容)

  • iphone13pro有3dtouch吗(iphone13pro有3dtouch功能吗)

    iphone13pro有3dtouch吗(iphone13pro有3dtouch功能吗)

  • 怎么隐藏微信置顶聊天(新版微信怎么隐藏置顶)

    怎么隐藏微信置顶聊天(新版微信怎么隐藏置顶)

  • 小米8老是自动关机(小米8老是自动关机怎么回事)

    小米8老是自动关机(小米8老是自动关机怎么回事)

  • a1699是苹果几(a1699是苹果几寸)

    a1699是苹果几(a1699是苹果几寸)

  • 微信聊天记录别人能调出来吗(微信聊天记录别人可以查出来吗)

    微信聊天记录别人能调出来吗(微信聊天记录别人可以查出来吗)

  • 微信号四年没登会注销吗(微信号四年没登录怎么办)

    微信号四年没登会注销吗(微信号四年没登录怎么办)

  • qq昵称查找是什么意思(qq网名查找)

    qq昵称查找是什么意思(qq网名查找)

  • 华为笔记本插着电源用吗(华为笔记本插着电源还无法开机)

    华为笔记本插着电源用吗(华为笔记本插着电源还无法开机)

  • .dbf是什么文件(.dbf是什么文件用什么打开)

    .dbf是什么文件(.dbf是什么文件用什么打开)

  • 抖音上怎么没有删除的功能(抖音上怎么没有特效功能了)

    抖音上怎么没有删除的功能(抖音上怎么没有特效功能了)

  • dp接口和hdmi区别(显示器的dp接口和hdmi区别)

    dp接口和hdmi区别(显示器的dp接口和hdmi区别)

  • 咪咕盒子怎么投屏(咪咕盒子怎么投屏索尼电视上)

    咪咕盒子怎么投屏(咪咕盒子怎么投屏索尼电视上)

  • 手机怎么开通qq微博(手机怎么开通QQ空间)

    手机怎么开通qq微博(手机怎么开通QQ空间)

  • oppo r9s强制关机(oppo r9手机强制关机)

    oppo r9s强制关机(oppo r9手机强制关机)

  • 荣耀20i怎么返回上一页面(荣耀20i怎么返回上一步)

    荣耀20i怎么返回上一页面(荣耀20i怎么返回上一步)

  • vue视频怎么变声音(vue怎么变声音)

    vue视频怎么变声音(vue怎么变声音)

  • iphone11和pro的区别(iphone11和pro的区别和max)

    iphone11和pro的区别(iphone11和pro的区别和max)

  • 探探怎么解除手机号码(探探怎么样才能解除)

    探探怎么解除手机号码(探探怎么样才能解除)

  • 在日本打中国手机号码(在日本打中国手机怎么打)

    在日本打中国手机号码(在日本打中国手机怎么打)

  • phicomm路由器初始密码(phicomm路由器初始名称)

    phicomm路由器初始密码(phicomm路由器初始名称)

  • xboxone手柄怎么关(xboxone手柄怎么配对主机)

    xboxone手柄怎么关(xboxone手柄怎么配对主机)

  • solo3防水吗(solo3进水了怎么办)

    solo3防水吗(solo3进水了怎么办)

  • 显示屏花屏(显示屏花屏是什么原因造成的)

    显示屏花屏(显示屏花屏是什么原因造成的)

  • 数据分析之Pandas(2)(数据分析利器:pandas库的应用课后答案)

    数据分析之Pandas(2)(数据分析利器:pandas库的应用课后答案)

  • 使用 Vite 插件开发构建 Tampermonkey 用户脚本(vite 插件开发)

    使用 Vite 插件开发构建 Tampermonkey 用户脚本(vite 插件开发)

  • 可抵扣暂时性差异是指在确定未来收回资产
  • 哪些资产损失向银行贷款
  • 幼儿园营业税税率是多少
  • 税务知识:同期资料应包括哪些内容?
  • 研究经费怎么写
  • 财务要做哪些表
  • 邀请客户参加公司会议
  • 交易性金融资产公允价值变动计入
  • 商业汇票如何申领
  • 承付期满日怎么算
  • 股权转让资本公积怎么处理
  • 注册公司买车划算吗
  • 施工企业营改增税费有哪些
  • 税控盘锁死还能报税吗
  • 营改增小规模纳税人增值税纳税实务实训
  • 垫资的利息的合法区间
  • 增值纳税人类别怎么选
  • 原材料销售出库会计分录
  • 医院会计制度准则
  • 电子税务局财报怎么报
  • 老板请客吃饭拿餐饮发票公司报销怎么账务处理?
  • 收到银行本票的会计分录怎么写
  • windows10如何更改时间
  • 冲销上月多记收入
  • win10怎么找应用程序
  • 前端解决方案
  • rtlrack.exe - rtlrack是什么进程 有什么用
  • macbook 运行windows
  • 金融企业贷款逾期怎么办
  • 公司购买写字楼怎么入账
  • gcasSWUpdater.exe是什么进程 有什么作用 gcasSWUpdater进程查询
  • 销售佣金在所得税里扣吗
  • php的用处
  • 研发人员的差旅费可以加计扣除吗
  • 小程序新版本
  • densenet详解
  • vue.js.
  • html编写
  • php字符串型数据的定义方式
  • 营业额增长率公式
  • 包工的人工费可以算工程款
  • 海关缴款书当月能查到吗
  • 结转生产成本是负数怎么办
  • 工程施工企业的增值税税率是多少
  • 商场收取租金如何入账
  • 用友T3财务报表没有数据
  • 暂存的凭证是怎么做的
  • 税控盘是什么会计科目
  • 代缴职工社保是啥意思
  • 信用证保证金有利息吗
  • 在建工程什么意思
  • 非盈利社会团体法人
  • 低于注册资本转股怎么办
  • 政府代建项目计划方案
  • 溢价发行债券取得的收益应如何处理
  • 用友作废的凭证怎么恢复
  • 预交了增值税款可以退吗
  • 分期付款购无形资产怎么入账?
  • 叉车上牌流程注册登记
  • 中小企业会计建议和意见
  • jdbc连接mysql数据库步骤
  • sql server高级应用
  • linux安装c环境
  • 通用pe工具箱安装win7
  • ksysslim.exe
  • win8系统可以装win7系统吗
  • windows 10 20h2推送
  • windos8怎么样
  • Win10 Mobile 10586.11已经在慢速通道推送 着离正式版更近了
  • linux常用命令cat
  • sql怎么设置自增列
  • jQuery用FormData实现文件上传的方法
  • js link global
  • 风力发电,光伏发电还有哪些
  • 北京朝阳地税搬哪去了
  • 兖州宁德新能源官网首页
  • 哪些润滑油属于危险品类
  • 转让定价调查与调整实务问答
  • 18个税种征税范围
  • 福建是高原还是平原
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设