微信小程序画布显示图片绘制矩形选区

在这里插入图片描述

wxml

<view class="page-body"><!-- 画布 --><view class="page-body-wrapper"><canvas canvas-id="myCanvas" type="2d" id="myCanvas" class='myCanvas' bindtouchstart="touchStart" bindtouchmove="touchMove" bindtouchend="touchEnd"></canvas></view><!-- 操作 --><view class="layout-bottom"><view class="page-bottom"><view class="pbottom pmiddle" bindtap="pre"><image src="/images/next2.png" style="height: 65rpx; width: 65rpx; " mode="aspectFit"></image><view class="pictureBottomArea"><p>返回</p></view></view><view class="pbottom pmiddle" bindtap="detection"><image src="{{sbUrl}}" style="height: 100rpx; width: 100rpx; " mode="aspectFit"></image><view class="pictureBottomArea1"><p>识别</p></view></view><view class="pbottom pmiddle" bindtap="clear"><image src="/images/qc3.png" style="height: 70rpx; width: 70rpx; " mode="aspectFit"></image><view class="pictureBottomArea"><p>清除选区</p></view></view></view></view>
</view>

wxss

.myCanvas { background-color: #F7F7F7; width: 100vw; height: 100vh; }
page { width: 100%; height: 100%; padding: 0; margin: 0; background-color: #F8F8F8; font-size: 32rpx; line-height: 1.6; display: flex; display: -webkit-flex; flex-direction: column; flex-wrap: wrap; justify-content: center; align-items: center; }
.page-body { width: 100%; height: 100%; padding: 0; margin: 0; }  .page-body-wrapper { width: 100%; height: 80%; display: flex; flex-direction: column; align-items: center; width: 100%; }
.layout-bottom { width: 100%; height: 20%; background-color: white; }
.page-bottom { width: 100%; height: 75%; display: flex; display: -webkit-flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; }
.pbottom { width: 33.333333333%; height: 100%; }
.pmiddle{ display: flex; display: -webkit-flex; flex-direction: column; flex-wrap: wrap; justify-content: center; align-items: center; }
.pictureBottomArea { margin-top: 15rpx; font-size: small; }
.pictureBottomArea1 { font-size: 0.9rem; letter-spacing:4rpx; font-weight: 600; color: #585858; }

js

图片适配画布显示,关键在于计数图片缩放比例


// 定义变量
let startX, startY, endX, endY, rectWidth, rectHeightPage({data: {drawWidth: 0,drawHeight: 0,drawX: 0,drawY: 0,ratio: 0,//缩放比例sbUrl: '/images/a2.png',//按钮imgSrc: '/images/ll.png',area: [],ctx: null,canvas: null,drawimage: null,},onLoad(options) {startX = 0startY = 0endX = 0endY = 0rectWidth = 0rectHeight = 0//把图片绘制到画布上this.drawImage(this.data.imgSrc)},//把图片绘制到画布上drawImage(imgSrc){let _this = thiswx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true }).exec((res0) => {//获取canvas宽高const canvas = res0[0].nodeconsole.log(canvas)let ctx = canvas.getContext('2d');const cw = res0[0].widthconst ch = res0[0].heightconsole.log('Canvas宽度:'+cw, 'Canvas高度:'+ch)const dpr = wx.getSystemInfoSync().pixelRatioconsole.log(dpr)canvas.width = cw * dpr     // 获取宽canvas.height = ch * dpr  // 获取高console.log(cw * dpr, ch * dpr)ctx.scale(dpr, dpr)wx.getImageInfo({src: imgSrc,success: function (res) {//获取图片宽高let iw = res.widthlet ih = res.heightconsole.log('图片宽度:'+iw, '图片高度:'+ih);// 计算绘制位置,保持原始比例let ratio = Math.min(cw / iw, ch / ih);console.log(ratio)// 图片适配画布显示,关键在于计数图片缩放比例let drawWidth = iw * ratio;let drawHeight = ih * ratio;console.log('图片缩放后宽度:'+drawWidth, '图片缩放后高度:'+drawHeight);let drawX = (cw - drawWidth) / 2;let drawY = (ch - drawHeight) / 2;// 到这里就可以直接绘制let image = canvas.createImage();//创建iamge实例image.src = imgSrc;  // 引入本地图片image.onload = function () {ctx.drawImage(image, 0, 0, drawWidth, drawHeight);}_this.setData({drawWidth: drawWidth,drawHeight: drawHeight,drawX: drawX,drawY: drawY,  ratio: ratio,ctx: ctx,canvas: canvas,drawimage: image})},fail: function (res) {console.error('获取图片信息失败', res);}});})},// 触摸开始事件touchStart(e) {startX = e.touches[0].xstartY = e.touches[0].yconsole.log("触摸开始事件", e.touches[0], startX, startY)},// 触摸移动事件touchMove(e) {let imgSrc = this.data.imgSrclet drawWidth = this.data.drawWidthlet drawHeight = this.data.drawHeightlet ctx = this.data.ctxlet image = this.data.drawimageendX = e.touches[0].xendY = e.touches[0].yctx.clearRect(0, 0, drawWidth, drawHeight)ctx.drawImage(image, 0, 0, drawWidth, drawHeight);rectWidth = endX - startXrectHeight = endY - startYctx.strokeRect(startX, startY, rectWidth, rectHeight)ctx.strokeStyle = 'red'ctx.stroke()},// 触摸结束事件touchEnd(e) {// 绘制完成后的操作// 可以将坐标框的位置和大小保存到全局变量或发送给服务器等console.log("触摸结束事件",e.changedTouches[0])},//清除绘制的图形clear(){console.log("清除绘制")let imgSrc = this.data.imgSrclet drawWidth = this.data.drawWidthlet drawHeight = this.data.drawHeightlet ctx = this.data.ctxlet image = this.data.drawimagectx.clearRect(0, 0, drawWidth, drawHeight)ctx.drawImage(image, 0, 0, drawWidth, drawHeight);startX = 0startY = 0endX = 0endY = 0rectWidth = 0rectHeight = 0},// 识别detection(e){console.log("开始识别")let ratio = this.data.ratio//获取绘制选区的相关信息,这里要除以图片缩放比例,才是真是图片上的框选区if (rectWidth != 0 && rectHeight != 0){console.log('矩形','x='+startX/ratio,'y='+startY/ratio,'Width='+rectWidth/ratio,'Height='+rectHeight/ratio)}},//上一页pre(){console.log("上一页")}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenFeign快速入门 替代RestTemplate

1.引入依赖 <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.spr…

【全网最全】2024电工杯数学建模B题问题一14页论文+19建模过程代码+py代码+2种保奖思路+数据等(后续会更新成品论文等)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模B题问一论文19建模过程代码py代码2种保奖思路数据等&#xff08;后续会更新成品论文等&#xff09;「首先来看看目前已…

C++中的四种类型转换运算符

隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&#xff0c;它并没有表…

MySQL中如何知道数据库表中所有表的字段的排序规则是什么?

查看所有表的字段及其排序规则&#xff1a; 你可以查询 information_schema 数据库中的 COLUMNS 表&#xff0c;来获取所有表的字段及其排序规则。以下是一个示例查询&#xff1a; SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM information_schema.COL…

【设计模式深度剖析】【5】【创建型】【原型模式】| 类比群发邮件,加深理解

&#x1f448;️上一篇:建造者模式 | 下一篇:创建型设计模式对比&#x1f449;️ 目录 原型模式(Prototype Pattern)概览定义英文原话直译 3个角色类图1. 抽象原型&#xff08;Prototype&#xff09;角色2. 具体原型&#xff08;Concrete Prototype&#xff09;角色3. 客户…

必示科技参与智能运维国家标准预研线下编写会议并做主题分享

近日&#xff0c;《信息技术服务 智能运维 第3部分&#xff1a;算法治理》&#xff08;拟定名&#xff09;国家标准预研阶段第一次编写工作会议在杭州举行。本次会议由浙商证券承办。 此次编写有来自银行、证券、保险、通信、高校研究机构、互联网以及技术方等29家单位&#xf…

Linux基础(四):Linux系统文件类型与文件权限

各位看官&#xff0c;好久不见&#xff0c;在正式介绍Linux的基本命令之前&#xff0c;我们首先了解一下&#xff0c;关于文件的知识。 目录 一、文件类型 二、文件权限 2.1 文件访问者的分类 2.2 文件权限 2.2.1 文件的基本权限 2.2.2 文件权限值的表示方法 三、修改文…

CSS3 新增背景属性 + 新增边框属性(如果想知道CSS3新增背景属性和新增边框属性的知识点,那么只看这一篇就够了!)

前言&#xff1a;CSS3在CSS2的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题&#xff0c;本篇文章主要讲解的为CSS3新增背景属性和新增边框属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSD…

视觉SLAM十四讲:从理论到实践(Chapter5:相机与图像)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 目标 理解针孔相机的模型、内参与径向畸变参数。理解一个空间点是如何投影到相机成像平面的。掌握OpenCV的图像存储与表达方式。学会基本的摄像头标定方法。 一、相…

机器学习第四十周周报 WDN GGNN

文章目录 week40 WDN GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 问题提出3.2 GNN3.3 CSI GGNN 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据获取4.3.2 参数设置4.3.3 实验结果 5. 结论二、GGNN1. 代码解释2. 网络结构小结参考文献参考文…

基础3 探索JAVA图形编程桌面:逻辑图形组件实现

在一个宽敞明亮的培训教室里&#xff0c;阳光透过窗户柔和地洒在地上&#xff0c;教室里摆放着整齐的桌椅。卧龙站在讲台上&#xff0c;面带微笑&#xff0c;手里拿着激光笔&#xff0c;他的眼神中充满了热情和期待。他的声音清晰而洪亮&#xff0c;传遍了整个教室&#xff1a;…

Hsql每日一题 | day02

前言 就一直向前走吧&#xff0c;沿途的花终将绽放~ 题目&#xff1a;主播同时在线人数问题 如下为某直播平台主播开播及关播时间&#xff0c;根据该数据计算出平台最高峰同时在线的主播人数。 id stt edt 1001,2021-06-14 12:12:12,2021-06-14 18:1…

【错误解决】使用HuggingFaceInstructEmbeddings时的一个错误

起因&#xff1a;使用huggingface构建一个问答程序时出现的问题。 错误内容&#xff1a; 分析&#xff1a; 查看代码发现&#xff0c;HuggingFaceInstructEmbeddings和sentence-transformers模块版本不兼容导致。 可以明显看到方法参数不同。 解决&#xff1a; 安装sentenc…

element-ui的Form 表单有些项的参数校验

项目场景&#xff1a; 提示&#xff1a;项目相关背景&#xff1a; 项目场景&#xff1a;有时候自己的Form 表单中的某几项引入的一些项不好去校验 这样的咋去校验呢&#xff1f; 解决方案&#xff1a; 提示&#xff1a;问题的具体解决方案&#xff1a; 例如&#xff1a;写一…

【pyspark速成专家】3_Spark之RDD编程1

目录 ​编辑 一&#xff0c;创建RDD 二&#xff0c;常用Action操作 三&#xff0c;常用Transformation操作 一&#xff0c;创建RDD 创建RDD主要有两种方式&#xff0c;一个是textFile加载本地或者集群文件系统中的数据&#xff0c; 第二个是用parallelize方法将Driver中的…

fortran77 初始化矩阵 打印矩阵 模版 备拷

1&#xff0c;源码 SUBROUTINE INIT_MATRIX(A, m, n, lda)DOUBLE PRECISION A(*)CALL SRAND(2024)DO i1, mDO j1, nA(i lda*(j-1)) RAND() RAND() C WRITE(*, (F8.4)) A(i)END DOEND DOENDSUBROUTINE PRINT_MATRIX(A, m, n, lda)DOUBLE PREC…

【Vue3】封装axios请求(cli和vite)

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 Vue 【Vue3】env环境变量的配置和使用&#xff08;区分cli和vite&#xff09; 文章目录 Vue前言一、常见用法二、vue3cli封装接口1..env配置2..dev(开…

ADC协议详解

文章目录 简介工作流程原理图时序图 优点与缺点 简介 模数转换器&#xff08;ADC&#xff0c;Analog-to-Digital Converter&#xff09;是一种将模拟信号转换为数字信号的电子设备。模拟信号通常表示物理测量的连续变化&#xff0c;如声音、温度、压力等&#xff0c;而数字信号…

codewars check_same_case 题解

题目 编写一个函数来检查两个给定的字符是否大小写相同。 如果任何字符不是字母&#xff0c;则返回-1如果两个字符大小写相同&#xff0c;则返回1如果两个字符都是字母且大小写不同&#xff0c;则返回0 例子 a并g返回1A并C返回1b并G返回0B并g返回00并?返回-1题解 1 此题主…

AI大模型与产品策略:产品经理的致胜之道

随着AI大模型的快速进化&#xff0c;其生态的构建&#xff0c;已经从C端过度到了B端。 作为产品经理&#xff0c;我们应该及时响应大趋势&#xff0c;在产品策略上融入AI大模型模块&#xff0c;深度挖掘AI大模型的应用价值&#xff0c;这才是作为PM在现阶段最有价值的地方。 …