uniapp 微信小程序 canvas 手写板获取书写内容区域并输出

本文主要是介绍uniapp 微信小程序 canvas 手写板获取书写内容区域并输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
在这里插入图片描述

uni.canvasGetImageData

返回一个数组,用来描述 canvas 区域隐含的像素数据,在自定义组件下,第二个参数传入自定义组件实例 this,以操作组件内 组件。

// 获取目标 canvas 的像素信息 pixelData
let canvas = uni.createSelectorQuery().select('.signature__canvas')
canvas.boundingClientRect().exec(function (data) {let canvasw = Math.ceil(data[0].width)let canvash = Math.ceil(data[0].height)uni.canvasGetImageData({width: canvasw,height: canvash,canvasId: 'canvas_sign',x: 0,y: 0,success: function (pixelData) {console.log(pixelData)},fail: (err) => {console.log('canvas 区域隐含的像素数据失败', err)},})
})

此处获取像素信息,传入 x:0,y:0,width:canvas宽度,height:canvas高度,获取到整个画布所有的像素点信息

如图是 pixelData 的打印
在这里插入图片描述
注意:里面的 Uint8ClampedArray 的长度,808752,此值是 width(812)* height(249)* 4 得出来的
为什么是 *4?

cannvas 的 imagedata 数据是一个由 RGBA 构成的数组,每四个值包含一个像素点的信息,RGBA: R - 红色(0-255)、G - 绿色(0-255)、B - 蓝色(0-255)、A - alpha 通道(0-255; 0 是透明的,255 是完全可见的)

所以,imagedata 实际上是 R G B A R G B A … 的一个数组

判断像素点是否有值

简单来讲,如果是4*3的12个像素点,中间两个像素点有值的情况下
在这里插入图片描述
程序判断有值无值,需要先从第一行开始(从第一列开始也可以),看第一行第一个有没有,第一行第二个有没有。。。依此看下去,第一行看完了看第二行。。。

const pixelDataWidth = pixelData.width
const pixelDataHeight = pixelData.height
for (var x = 0; x <= pixelData.width; x++) {for (var y = 0; y <= pixelData.height; y++) {var i = (x * pixelData.width + y) * 4// 每个像素判断 rgba 是否有值,则认为有数据if (pixelData.data[i] != 0 || pixelData.data[i + 1] != 0 || pixelData.data[i + 2] != 0 || pixelData.data[i + 3] != 0) {// ...}}
}

我们通过上面循环能够知道,哪个像素点有值了,之后就能得出一个边界值 startX、startY、endX、endY
在这里插入图片描述
startX 为最偏左的点的 X,startY 为最偏上的 Y,endX 为最偏右的 X,endY 为最偏下的 Y

// startX 和 startY 为取小逻辑,即有值坐标,比初始坐标小,则将 startX 和 startY 赋值
var startX = pixelData.width + 1
var startY = pixelData.height + 1
// endX 和 endY 为取大逻辑,即有值坐标,比初始(-1,-1)大,则将 endX 和 endY 赋值
var endX = -1
var endY = -1if (startX > x) startX = x
if (startY > y) startY = y
if (endX < x) endX = x
if (endY < y) endY = y

这样我们就得到了,startX、startY、endX、endY

uni.canvasToTempFilePath

uni.canvasToTempFilePath({x: 100, // 画布x轴起点(默认0)y: 200, // 画布y轴起点(默认0)width: 50, // 画布宽度(默认为canvas宽度-x)height: 50, // 画布高度(默认为canvas高度-y)destWidth: 100, // 输出图片宽度(默认为 width * 屏幕像素密度)destHeight: 100, // 输出图片高度(默认为 height * 屏幕像素密度)canvasId: 'myCanvas',success: function(res) {// 在H5平台下,tempFilePath 为 base64console.log(res.tempFilePath)} 
})
x: startX,
y: startY,
width: endX - startX,
height: endY - startY,
destWidth: endX - startX,
destHeight: endY - startY,

按照上面的 x、y、width。。。输出即可

这篇关于uniapp 微信小程序 canvas 手写板获取书写内容区域并输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857795

相关文章

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字