VX小程序 实现区域转图片预览
图例

方法一
1、安装插件 wxml2canvas
npm install --save wxml2canvas
git地址参照:https://github.com/wg-front/wxml2canvas
2、类型
// 小程序页面
let data={list:[{type:'wxml',class:'.test_center .draw_canvas',limit:'.test_center',x:0,y:0}]
}
3、数据结构
let testData=[{PageIndex:1,ImageUrl:"https://minio.23544.com:9010/mk-sys-test/origin-paper/432531489095806/2023-06-26-15-42-38/9d43c15bb1834cacb0a8900b5e45dfb2/1.jpg",Height:1680.0,Width:1200.0,Questions:[{"QuestionNum":"1-2","X":140.00000450195313,"Y":515.989620895996,"Width":149.77778,"Height":54.77778,"score":1.00,"totalScore":2.00},{"QuestionNum":"1111","X":113.10765335144043,"Y":756.3195006567382,"Width":799.77778,"Height":199.77778,"score":0.0,"totalScore":0.0},{"QuestionNum":"2222","X":100.0000025946045,"Y":822.2222792822265,"Width":799.77778,"Height":199.77778,"score":0.0,"totalScore":0.0},{"QuestionNum":"12","X":95.9895980078125,"Y":1260.989620895996,"Width":1022.77778,"Height":305.77778,"score":1.00,"totalScore":14.00},]},{PageIndex:1,ImageUrl:"https://minio.23544.com:9010/mk-sys-test/origin-paper/432531489095806/2023-06-26-15-42-38/9d43c15bb1834cacb0a8900b5e45dfb2/1.jpg",Height:1680.0,Width:1200.0,Questions:[{"QuestionNum":"1-2","X":140.00000450195313,"Y":515.989620895996,"Width":149.77778,"Height":54.77778,"score":1.00,"totalScore":2.00},{"QuestionNum":"1111","X":113.10765335144043,"Y":756.3195006567382,"Width":799.77778,"Height":199.77778,"score":0.0,"totalScore":0.0},{"QuestionNum":"2222","X":100.0000025946045,"Y":822.2222792822265,"Width":799.77778,"Height":199.77778,"score":0.0,"totalScore":0.0},{"QuestionNum":"12","X":95.9895980078125,"Y":1260.989620895996,"Width":1022.77778,"Height":305.77778,"score":1.00,"totalScore":14.00},]}]
4、页面引用
<template><canvas canvas-id="canvas1" class="test_center"></canvas>
</template><script setup>
import Wxml2Canvas from 'wxml2canvas';
const onclicks=()=> {person.drawImage = new Wxml2Canvas({width: 340,height: 210,element: 'canvas1',background: '#f0f0f0',finish(url) {console.log(7777,url)uni.previewImage({// 需要预览的图片链接列表urls: [url],// 为当前显示图片的链接/索引值current: url,// 图片指示器样式 indicator:'default',// 是否可循环预览loop:false});},error (res) {}});let data = {list: [{type: 'image',x: 0,y: 0,url: person.itemExam.ImageUrl,style: {width: person.itemExam.Width*person.scaleWidth,height: person.itemExam.Height*person.scaleWidth,border: '0 solid #aaaaaa',boxShadow: '10 20 20 rgba(0, 0, 0, 0.4)'}}]}person.itemExam.Questions.forEach((quest,itIndex)=>{data.list.push({type: 'text',text: quest.score,x: quest.X*person.scaleWidth,y: quest.Y*person.scaleWidth,style: {textAlign: 'right',width: quest.Width*person.scaleWidth-40,height: quest.Height*person.scaleWidth-40,fontSize: 16,color: 'red',border: '0px solid red',padding: '6px 40px 0 0'}})data.list.push({type: 'text',text: ' /'+quest.totalScore,x: quest.X*person.scaleWidth,y: quest.Y*person.scaleWidth,style: {textAlign: 'right',width: quest.Width*person.scaleWidth-6,height: quest.Height*person.scaleWidth-6,fontSize: 16,color: 'blue',border: '1px solid red',padding: '6px 6px 0 0'}})})person.drawImage.draw(data);
}
</script>
方法二
1、使用canvas画图组件
有坑:uni.getImageInfo 方法转出的地址是http 不是https,而 uni.previewImage 识别 https的,否则图片会出不来
<template>
<canvas v-if="person.isShowExam" @click="saveFile" class="test_center" canvas-id="postCanvars" :width="person.itemExam.Width*person.scaleWidth" :height="person.itemExam.Height*person.scaleWidth"></canvas>
<view v-else @click="saveFile" class="test_center" :style="{width:person.itemExam.Width*person.scaleWidth+'px;',height:person.itemExam.Height*person.scaleWidth+'px;'}"><image class="draw_canvas" data-type="image" :src="person.itemExam.ImageUrl" mode=""></image><view class="test_center_page draw_canvas"><view class="page_item flex draw_canvas" v-for="(quest,quIndex) in person.itemExam.Questions" :key="quIndex":style="{ top:quest.Y*person.scaleWidth +'px;',left:quest.X*person.scaleWidth+'px;',width:quest.Width*person.scaleWidth+'px;',height:quest.Height*person.scaleWidth+'px;'}"><view class="text_flex flex draw_canvas"><text class="color_red draw_canvas">{{quest.score}}</text>/<text class="color_blue draw_canvas">{{quest.totalScore}}</text></view></view></view>
</view></template>
<script setup>
import { reactive, ref, watch } from 'vue'
import { onLoad, onShow } from "@dcloudio/uni-app";
const person=reactive({itemExam:{PageIndex:1,ImageUrl:"https://minio.23544.com:9010/mk-sys-test/origin-paper/432531489095806/2023-06-26-15-42-38/9d43c15bb1834cacb0a8900b5e45dfb2/1.jpg",Height:1680.0,Width:1200.0,Questions:[{"QuestionNum":"1-2","X":140.00000450195313,"Y":515.989620895996,"Width":149.77778,"Height":54.77778,"score":1.00,"totalScore":2.00},{"QuestionNum":"1111","X":113.10765335144043,"Y":756.3195006567382,"Width":799.77778,"Height":199.77778,"score":0.0,"totalScore":0.0},{"QuestionNum":"2222","X":100.0000025946045,"Y":822.2222792822265,"Width":799.77778,"Height":199.77778,"score":0.0,"totalScore":0.0},{"QuestionNum":"12","X":95.9895980078125,"Y":1260.989620895996,"Width":1022.77778,"Height":305.77778,"score":1.00,"totalScore":14.00},]},scaleWidth:0,scaleHeight:0,sharePoster:'',isShowExam:false
})onLoad(()=>{// 获取屏幕宽uni.getSystemInfo({success:(res)=> {person.scaleWidth = res.windowWidth/person.itemExam.Widthperson.scaleHeight = res.windowHeight/person.itemExam.Height}})
})
// 保存照片
const saveFile=()=>{person.isShowExam=trueuni.getImageInfo({src: person.itemExam.ImageUrl,success(res) {let context = uni.createCanvasContext('postCanvars')// 绘制图片context.drawImage(res.path, 0, 0, person.itemExam.Width*person.scaleWidth, person.itemExam.Height*person.scaleWidth)context.stroke()person.itemExam.Questions.forEach((quest,itIndex)=>{// 绘制矩形context.setStrokeStyle('red')context.rect(quest.X*person.scaleWidth, quest.Y*person.scaleWidth, quest.Width*person.scaleWidth, quest.Height*person.scaleWidth)context.textAlign ='right'context.stroke()// 红色文字context.setFontSize(16)context.setFillStyle('red')context.fillText(quest.score+'', quest.X*person.scaleWidth+24, quest.Y*person.scaleWidth+20)context.textAlign ='right'// 分割斜线context.setFillStyle('#000')context.fillText('/', quest.X*person.scaleWidth+32, quest.Y*person.scaleWidth+20)// 蓝色文字context.setFillStyle('blue')context.fillText(quest.totalScore, quest.X*person.scaleWidth+50, quest.Y*person.scaleWidth+20)context.textAlign='right'context.stroke()return context})// 生成照片保存context.draw(true, () => {uni.canvasToTempFilePath({canvasId: 'postCanvars',success: (res) => {uni.previewImage({// 需要预览的图片链接列表urls: [res.tempFilePath],// 为当前显示图片的链接/索引值current: res.tempFilePath,// 图片指示器样式 indicator:'default',// 是否可循环预览loop:false});},fail: (res) => {uni.showToast({title:'生成照片失败'})} })})}})
}</script><style lang="scss" scoped>
.test_center{width: 99%;height: calc(100vh - 310rpx);position: relative;overflow: hidden;image{width: 100%;height: 100%;}.page_item{position: absolute;border: 2rpx solid red;.text_flex{position: absolute;right: 20rpx;top: 0;text{font-size: 36rpx;font-weight: 600;}}}
}
.color_red{color: #FF2929;
}
.color_blue{color: #6B86FF;
}
</style>
希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~
相关文章:
VX小程序 实现区域转图片预览
图例 方法一 1、安装插件 wxml2canvas npm install --save wxml2canvas git地址参照:https://github.com/wg-front/wxml2canvas 2、类型 // 小程序页面 let data{list:[{type:wxml,class:.test_center .draw_canvas,limit:.test_center,x:0,y:0}] } 3、数据结…...
HTML5-1-标签及属性
文章目录 语法规范标签规范标签列表通用属性基本布局 页面的组成: HTML(HyperText Markup Language,超文本标记语言)是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言。 HTML5 是下一代 HTM…...
5017. 垦田计划
Powered by:NEFU AB-IN Link 文章目录 5017. 垦田计划题意思路代码 5017. 垦田计划 题意 略 思路 二分最小需要几天即可 注意: 天数不能低于k二分时,若耗时天数小于mid,直接continue 代码 /* * Author: NEFU AB-IN * Date: 2023-08-26 22:4…...
【校招VIP】产品思维分析之面试新的功能点设计
考点介绍: 这种题型是面试里出现频度最高,也是难度最大的一种,需要面试者对产品本身的功能、扩展性以及行业都有一定的了解。而且分析时间较短,需要一定的产品能力和回答技巧。 『产品思维分析之面试新的功能点设计』相关题目及解…...
indexDB vue 创建数据库 创建表 添加对象数据
1 .open(dbName,1) 版本号可以省略 let dbName hist-data-1dconst request indexedDB.open(dbName); // 如果你不知道数据库的版本号,可以省略第二个参数,这样 indexedDB 会默认为你打开最新版本的数据库,因为版本号总是自增长的 2 第一次…...
Django基础1——项目实现流程
文章目录 一、前提了解二、准备开发环境2.1 创建项目2.1.1 pycharm创建2.1.2 命令创建 2.2 创建应用 例1:效果实现例2:网页展示日志文件 一、前提了解 基本了解: 官网Django是Python的一个主流Web框架,提供一站式解决方案…...
基于SSM的在线购物系统——LW模板
摘 要 人类进入21世纪以来,很多技术对社会产生了重大的影响。信息技术是最具代表的新时代技术,信息技术起源于上世纪,在起初的时候只是实现在单机上进行信息的数字化管理,随着网络技术、软件开发技术、通讯技术的发展,…...
Mac操作系统上设置和配置PPPoE连接
嗨,在使用Mac的小伙伴么!你是否在Mac操作系统上尝试设置和配置PPPoE连接,却不知道怎么设置?别担心,今天我将为你一步步教你如何在Mac上进行设置和配置。无论你是新手还是有经验的用户,本文都将帮助你轻松完…...
Python类的属性和方法
Python类是一种面向对象编程的基本概念,它可以用来创建对象,对象可以拥有属性和方法。 属性是类的特征,它们用于存储对象的状态。属性可以是任何数据类型,例如整数、字符串、列表等。在类中,属性通常定义为类的变量&am…...
C#Queue<T>队列出现弹出元素被最后一次压入得元素覆盖的问题
问题代码: //以下为现有代码的大概描述,只可意会,不可执行!!!Queue<Move> mQueue new Queue<Move>(); //该接口为下面描述线程A、线程B调用的接口 private void ActionTrigger(Move move)//M…...
python3GUI--模仿一些b站网页端组件By:PyQt5(详细介绍、附下载地址)
文章目录 一.前言二.展示1.banner1.静图2.动图 2.一般视频组件1.静图2.动图 3.排行榜1.静图2.动图 三.设计心得(顺序由简到难)1.排行榜2.一般视频组件3.banner 四.总结五.下载地址 一.前言 播客二连发&…...
聚类分析概述
聚类分析(Cluster Analysis)是一种无监督学习方法,用于将数据点划分为具有相似特征的组或簇。聚类分析的目标是使同一簇内的数据点之间的相似性最大化,而不同簇之间的相似性最小化。聚类分析在许多领域中都有广泛的应用࿰…...
建模杂谈系列234 基于图的程序改造
说明 为了进一步提升程序设计与运维的可靠性,我觉得(目前看来)只有依赖图的结构。 提升主要包含如下方面: 1 程序结构的简洁性:节点和边2 程序执行的可视化:交通图(红、黄、绿)3 程序支持的逻辑复杂性。…...
requestAnimationFrame(RAF)
1、RAF介绍 requestAnimateFrame(RAF)动画帧,是一个做动画的API。 如果想要一个动画流畅,就需要以60帧/s来更新视图,那么一次视图的更新就是16.67ms。 想要达到上述目标,可以通过setTimeout定时器来手动控…...
【JavaScript笔记】面对对象与构造函数
笔记作用 了解面向对象编程中的一般概念 能够基于构造函数创建对象 理解 JavaScript 中一切皆对象的语言特征 理解引用对象类型值存储的的特征 掌握包装类型对象常见方法的使用 一、深入对象 了解面向对象的基础概念,能够利用构造函数创建对象。 1. 构造函数 …...
LeetCode解法汇总5-正则表达式匹配
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你一棵…...
前端开发工具: VSCode
VSCode 安装使用教程(图文版) | arry老师的博客-艾编程 1. 下载 在官方网站:https://code.visualstudio.com/ 下载最新版本的 VSCode 即可 2. VSCode 常见插件安装 所有插件安装后,需要重启一下才生效 2.1 简体中文语言包 2.2 编辑器主…...
【Stable-Diffusion-WebUI】Windows系统安装Stable-Diffusion-WebUI
写在前面 基于 stable-diffusion 封装的 webui 开源项目,通过界面交互的方式来使用 stable-diffusion,降低了使用门槛,可以通过本地部署的方式进行访问,对电脑的配置要求较高,以下配置要求仅供参考 GPU显卡ÿ…...
面试题(三)
目录 一.Spring 1.Spring IOC & AOP 2.Spring bean (1) 作用域 (2) Spring 中的 bean ⽣命周期 (3) Spring 框架中⽤到了哪些设计模式 二.Mybatis 1.标签 2.Dao接口 3.返回与映射 4.延迟加载 三.Kafka 四.设计模式 1.IO 设计模式 2.Spring 中的设计模式详解…...
谈谈子网划分的定义、作用、划分方式以及案例
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、子网划分的定义 二、子网掩码的作用 1、…...
如何构建现代自托管音乐播放器:音乐爱好者的完整使用指南
如何构建现代自托管音乐播放器:音乐爱好者的完整使用指南 【免费下载链接】feishin A modern self-hosted music player. 项目地址: https://gitcode.com/gh_mirrors/fe/feishin 在数字音乐时代,音乐爱好者面临着数据隐私、平台依赖和个性化体验的…...
Taotoken用量看板如何帮助团队精确管理大模型API支出
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板如何帮助团队精确管理大模型API支出 对于团队管理者而言,在大模型应用开发过程中,一个核心…...
Wireshark进阶实战:15分钟定位真实网络故障根因
1. 这不是“又一个Wireshark教程”,而是我三年里修过的27个真实网络故障现场 你打开Wireshark,看到满屏滚动的TCP、HTTP、DNS包,心里发虚——不是不会点“开始捕获”,而是根本不知道该盯哪一行、为什么这一行比那一行重要、哪个字…...
Hermes Agent项目如何接入Taotoken作为自定义模型提供商
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent项目如何接入Taotoken作为自定义模型提供商 Hermes Agent 是一个功能强大的 AI 代理框架,它支持通过自定义…...
Android Framework 1
Android Framework 1环境准备Ubuntu 环境配置下载安卓源码编译源码Android Studio 环境编译环境准备 VMware WorkStation Pro 17.6.4 Ubuntu 20.04 安卓源码官方地址 Ubuntu 环境配置 1.安装必须的软件包 sudo apt-get install git-core gnupg flex bison build-essential …...
开发AI应用时利用Taotoken实现多模型聚合与路由策略
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发AI应用时利用Taotoken实现多模型聚合与路由策略 应用场景类,面向正在构建复杂AI应用的架构师或开发者,…...
如何快速掌握Chanlun-Pro:缠论量化交易的终极实战指南
如何快速掌握Chanlun-Pro:缠论量化交易的终极实战指南 【免费下载链接】chanlun-pro 基于缠中说禅所讲缠论理论,以便量化分析市场行情的工具 项目地址: https://gitcode.com/gh_mirrors/ch/chanlun-pro Chanlun-Pro是一款基于缠中说禅理论的智能量…...
从原理图到Ping通:我的STM32F407 RMII以太网调试笔记(含LAN8720硬件差异处理)
从原理图到Ping通:我的STM32F407 RMII以太网调试笔记(含LAN8720硬件差异处理) 第一次点亮STM32F407的以太网接口时,那种成就感至今难忘。但在此之前,我经历了整整两周的煎熬——原理图反复检查、PCB打样两次、软件调试…...
实时任意风格迁移:AdaIN算法在PyTorch中的优雅实现
实时任意风格迁移:AdaIN算法在PyTorch中的优雅实现 【免费下载链接】pytorch-AdaIN Unofficial pytorch implementation of Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization [Huang, ICCV2017] 项目地址: https://gitcode.com/gh_mi…...
通过curl命令快速测试Taotoken大模型聚合接口的连通性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken大模型聚合接口的连通性 在接入大模型服务时,直接使用curl命令进行接口测试是一种高效且…...
