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

这篇具有很好参考价值的文章主要介绍了VX小程序 实现区域转图片预览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图例

VX小程序 实现区域转图片预览,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.Width
			person.scaleHeight = res.windowHeight/person.itemExam.Height
		}
	})
}) 
// 保存照片
const saveFile=()=>{
	person.isShowExam=true
	uni.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>

     希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~文章来源地址https://www.toymoban.com/news/detail-675148.html

到了这里,关于VX小程序 实现区域转图片预览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序中使用wx.previewImage实现图片预览与缩放

    在小程序文档中我们可以看到wx.previewImage的功能是在新页面中全屏预览图片,预览的过程中用户可以进行保存图片、发送给朋友等操作。但其实还有一个隐藏功能缩放图片,最小为原比例。话不多说,上代码: xml代码: src的路径换成自己的图片路径就可以了,可以是像上面

    2024年01月17日
    浏览(48)
  • 微信小程序(二)微信小程序选择本地图片显示并预览(实现左右滑动)

    在微信小程序里面实现选择图片然后预览是一个非常普遍的功能,在我们上传图片文件的时候,都会选择本地的图片进行上传,在上传之前会查看一下自己上传的图片是否准确。所以要做到预览图片。 下面就实现一个简单的本地图片显示预览的功能~~ 1、创建页面 这里我直接

    2024年02月03日
    浏览(76)
  • 微信小程序---图片裁剪、旋转、预览、上传功能实现(已经封装成组件,需要的到资源下载)

    1、可以拍摄或选择本地图片上传图片数据 2、图片上传数据可以进行裁剪、选择、取消、裁剪后预览、上传以及限制大小,还可以缩放操作,需要的可以解除限制即可 1、点击图片上传按钮时,跳转页面到cropper进行图片选择剪切 wx.navigateTo({       url: `/pages/cropper/cropper?d

    2023年04月26日
    浏览(77)
  • uniapp - [微信小程序] 实现点击预览各种文件 pdf文档、视频mp4、mp3音乐、图片图像、word/excel/ppt 等,uniapp小程序文件预览功能(详细示例代码,一键复制开箱即用)

    在uniapp微信小程序平台开发中,详细实现文件预览功能,支持预览pdf/mp3/mp4/图片/word/excel/ppt等常见文件,在线下载并预览功能。 直接复制运行示例代码,稍微改下就能用了。

    2024年02月04日
    浏览(88)
  • 微信小程序点击图片放大预览,新页面中全屏预览图片

    第一步:在wxml中定义image组件,并设置绑定事件。 第二步:在js中设置需要预览图片的URL数组, 切记一定要是数组 ,即使一张图也要是数组,不能直接字符串赋值。 2.1 data数据设置 2.2 绑定事件函数编制 3.wx.previewImage组件官方调用指南 4、效果预览

    2024年02月11日
    浏览(73)
  • 微信小程序-图片预览图

    有时候图片列表图片过小看不清图片内容,这时我们一般就希望点击图片可以放大显示进行预览,那么,接下来我们就调用微信原生API的的浏览图片程序进行对图片预览的实现。 通过微信原生API实现单张图片的浏览 wxml代码 添加对应js的点击事件,调用预览图片的API,实现图

    2024年02月08日
    浏览(70)
  • uniapp微信小程序 图片&文件上传并且支持图片和文件预览(pdf等文件预览)巨细教学!

    首先呢,小程序打开pdf等文件有下面几种办法: 用微信自带的wx.downloadFile() + wx.openDocument() 使用web-view,uni-app中webview可以直接加载pdf文件 可以使用网上说的pdf.js去实现(我没有用到这个,就不介绍了) 网上查到很多资料显示安卓是可以通过上面第一种办法,但是ios用第一个

    2024年02月04日
    浏览(71)
  • 小程序中使用上传图片,显示、删除、预览

    需要哦用户点击加号上传图片,并展示所上传图片和能够删除和预览 采用的uniapp,创建了一个view容器包裹加号图标和展示的图片。 内部展示图片超过9张时候,加号图片隐藏 点击加号 uni.showActionSheet(OBJECT) 点击后又使用看图片选择API 从底部向上弹出操作菜单 OBJECT参数说明

    2024年01月18日
    浏览(37)
  • 微信小程序上传文件及图片(可以预览)

    最近在写小程序项目,碰到了一个需求,需要用户可以上传各种类型的文件和图片,展示在页面上,并且点击还可以进行预览,就找了找微信小程序官网,写了一个例子,分享一下 直接看代码: wxml: wxss: js: 有问题和建议欢迎大家留言

    2024年02月12日
    浏览(55)
  • vue+ElementUI实现点击图片预览大图和预览视频

    最近遇到一个需求: 在表格中实现预览图片和查看视频 预览图片功能: 如下,是材料一栏的代码 在 data 中定义: methods 中: style 中: 预览图片的功能就完成了. 接下来是查看视频: 安装 vue-video-player 在 main.js 中: 在写的vue页面中引入: 当时在 main.js 中引入后,发现这个插件没效果,然后

    2023年04月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包