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

  • 怎样充分的利用自媒体平台做矩阵推广(怎样充分利用课余时间)

    怎样充分的利用自媒体平台做矩阵推广(怎样充分利用课余时间)

  • 华为手表新款watch3怎么独立通话(华为手表新款watch3pro怎么连接手机)

    华为手表新款watch3怎么独立通话(华为手表新款watch3pro怎么连接手机)

  • wps为什么不能导出视频(wps为什么不能导入手机相册视频)

    wps为什么不能导出视频(wps为什么不能导入手机相册视频)

  • 荣耀8x隐私双系统(荣耀8x隐私空间怎么用)

    荣耀8x隐私双系统(荣耀8x隐私空间怎么用)

  • 超级截屏怎么没有声音(超级截屏的图片在哪里)

    超级截屏怎么没有声音(超级截屏的图片在哪里)

  • 快充是充电头还是数据线(快充是充电头还是手机的作用)

    快充是充电头还是数据线(快充是充电头还是手机的作用)

  • b站ul怎么升级(b站ul怎么升级哪里看)

    b站ul怎么升级(b站ul怎么升级哪里看)

  • 苹果官网退款多久(苹果官网退款多久到微信)

    苹果官网退款多久(苹果官网退款多久到微信)

  • 电话被拉黑了打过去会听到什么(电话被拉黑了打face time可以吗)

    电话被拉黑了打过去会听到什么(电话被拉黑了打face time可以吗)

  • 修改宝贝库存会降权吗(修改宝贝库存会有影响吗)

    修改宝贝库存会降权吗(修改宝贝库存会有影响吗)

  • qq解除关联后会对方会收到通知吗(qq解除关联后会对方会收到提示信息吗)

    qq解除关联后会对方会收到通知吗(qq解除关联后会对方会收到提示信息吗)

  • oppor11plus啥时候出来(oppor11plus什么时间上市)

    oppor11plus啥时候出来(oppor11plus什么时间上市)

  • 京东取消订单钱会退吗(京东取消订单钱到账了东西送过来了)

    京东取消订单钱会退吗(京东取消订单钱到账了东西送过来了)

  • 微软surface1724是几代(微软surface1769)

    微软surface1724是几代(微软surface1769)

  • viv0手机hd怎么关掉(vivo手机hd怎么关闭hd)

    viv0手机hd怎么关掉(vivo手机hd怎么关闭hd)

  • 芒果tv怎么解除绑定卡(芒果tv怎么解除qq绑定)

    芒果tv怎么解除绑定卡(芒果tv怎么解除qq绑定)

  • 快手相册视频怎么删除(快手相册视频怎么能让图多转几圈、手机存视频不能从拍)

    快手相册视频怎么删除(快手相册视频怎么能让图多转几圈、手机存视频不能从拍)

  • vivox27有红外线吗(vivox27有红外线遥控功能吗)

    vivox27有红外线吗(vivox27有红外线遥控功能吗)

  • 一加7有没有耳机孔(一加7有没有耳机插孔)

    一加7有没有耳机孔(一加7有没有耳机插孔)

  • 加勒比海的片脑纹珊瑚,开曼群岛 (© Alex Mustard/Minden Pictures)(加勒比海百科)

    加勒比海的片脑纹珊瑚,开曼群岛 (© Alex Mustard/Minden Pictures)(加勒比海百科)

  • 前端请求中body和query传参(前端请求方式)

    前端请求中body和query传参(前端请求方式)

  • mysql事务启动的方式(mysql事务引擎)

    mysql事务启动的方式(mysql事务引擎)

  • 税收的本质是什么意思?
  • 电子汇票提示付款撤销
  • 事业单位补提折旧怎么处理
  • 个体户转一般纳税人怎么做账
  • 集团内部资产无偿划转是否纳税增值税
  • 固定资产减少当月
  • 制造企业需要设哪些部门
  • 个人以不动产投资入股
  • 商业企业的商品销售额、职工人数是( )
  • 长期股权投资转入持有待售资产
  • 暂估成本跨年后未收到票如何处理
  • 房屋租赁协议填写版本
  • 营改增后征收增值税的税目
  • 没有座机怎么填固定电话
  • 金税三期啥意思
  • 国家税务总局2011年第25号公告
  • 航空公司按照一次性收费
  • 收到联营企业分派的现金股利为什么不计入利润总额
  • 维修材料费主要包括
  • 苹果macos catalina10.15.7
  • linux路由器配置实例
  • 出纳日记账填写样本
  • php提高性能
  • php双冒号和箭头
  • 上月暂估成本高了这个月怎么做账
  • ue4安装插件
  • php for break
  • 怎么查上市公司
  • dvd.rom
  • 企业存款利息收入增值税
  • 建筑企业预缴企业所得税怎么计算
  • 小茴香的栽培技术
  • PHP:JulianToJD()的用法_日历函数
  • 以前年度应扣未扣支出
  • 新能源产业发展历程
  • 微信小程序实现文件上传
  • 睿智目标检测yolov8
  • php类和对象的关系
  • 文章列表是什么
  • 增值税发票打印出格了能用吗
  • 关税对企业有什么影响
  • 增值税专用发票有几联?
  • 预收账款开票了怎么做账报税
  • 收到客户付款多久到账
  • 销售不动产统一发票怎么没有税率
  • 公司活动举办属于哪个部门
  • sqlserver2005没有服务器名称
  • sh sqlplus
  • mdf和ndf文件
  • 企业给员工报销的个人消费支出如何计税
  • 增值税扣缴义务发生时间为扣缴义务人扣缴税款的当天
  • 积分兑换商品怎么查快递
  • 销售退回的会计分录全过程
  • 复利终值和年金终值的公式
  • 非正常损失的进项税
  • 作废的支票由谁保管
  • 清理固定资产是什么意思
  • 发票边上的孔有什么用
  • 模具的生产工艺流程
  • xp系统找不到指定的路径怎么办
  • windows2003 IIS6.0 asp配置技巧
  • centos7 network
  • win10总是锁定
  • 微软官方屏蔽更新工具
  • windows更新某些设置由你的组织来管理是什么意思
  • Extjs4.0 ComboBox如何实现三级联动
  • 简单理解贴现
  • css弹出层
  • socket pf_inet
  • opengl入门视频教程
  • autorun病毒怎么清理
  • Unity3D事件函数的执行顺序
  • 安卓手机本地
  • js过滤filter
  • unity获取ui
  • jquery使用教程
  • 权限android.permission.write
  • jquery complete
  • 如何理解计算消费税时的(1
  • 电信业八大争议事件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设