微信小程序畫布顯示圖片繪制矩形選區

在這里插入圖片描述

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.pswp.cn/web/14507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14507.shtml
英文地址,請注明出處:http://en.pswp.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…

在云計算環境中,如何實現資源的高效分配和調度?

在云計算環境中&#xff0c;可以通過以下幾種方法實現資源的高效分配和調度&#xff1a; 負載均衡&#xff1a;通過負載均衡算法&#xff0c;將云計算集群的負載均勻地分配到各個節點上。常見的負載均衡算法有輪詢、最小連接數、最短響應時間等。 資源調度算法&#xff1a;為了…

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. 網絡結構小結參考文獻參考文…

Vue 2 和 Vue 3 中同步和異步

Vue 2 和 Vue 3 中同步和異步 Vue 2 同步和異步 同步更新 (Synchronous Updates) Vue 2 在數據更新后會進行同步渲染更新,但為了性能優化,Vue 會在內部隊列中異步地進行 DOM 更新。這意味著數據變化會立即被捕捉到,但實際的 DOM 更新會被推遲到下一個事件循環隊列中。new V…

基礎3 探索JAVA圖形編程桌面:邏輯圖形組件實現

在一個寬敞明亮的培訓教室里&#xff0c;陽光透過窗戶柔和地灑在地上&#xff0c;教室里擺放著整齊的桌椅。臥龍站在講臺上&#xff0c;面帶微笑&#xff0c;手里拿著激光筆&#xff0c;他的眼神中充滿了熱情和期待。他的聲音清晰而洪亮&#xff0c;傳遍了整個教室&#xff1a;…

Linux模擬考試

注意&#xff0c;以下答案僅供參考 1、某CentOS系統空間不夠&#xff0c;現加一塊100G的硬盤(是系統的第二塊硬盤&#xff09;&#xff0c;分為一個區99G&#xff0c;掛載點是/data&#xff0c;請寫出從分區到掛載并使用的整個步驟及相關命令。 1.創建分區&#xff1a; sudo f…

HTML5 通信方式及應用

目錄 postMessage APIWebSocketsServer-Sent Events (SSE)Fetch API / XMLHttpRequest (XHR)Web Workers & Service WorkersHTML5 提供了多種通信方式,使得瀏覽器中的Web應用能夠實現頁面間、窗口間、甚至與外部服務的有效通信。這些通信方式大大提升了Web應用的交互性和復…

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…

json 讀寫 python

目錄 這里對json保存做了格式封裝 調用代碼&#xff1a; python json原始保存是所有json保存一行&#xff0c; 這里對json保存做了格式封裝 import numpy as np class MyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.integer):return int(obj)…

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中的…