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 = -1

if (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 为 base64
    console.log(res.tempFilePath)
  } 
})
x: startX,
y: startY,
width: endX - startX,
height: endY - startY,
destWidth: endX - startX,
destHeight: endY - startY,

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤

集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…

linux 内存介绍

大致共有四类&#xff1a;VSS、RSS、PSS、USS &#xff0c;通常情况下&#xff0c;VSS > RSS > PSS > USS 1.VSS(Virtual Set Size)虚拟耗用内存&#xff08;包含共享库占用的内存&#xff09; VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已…

Vue3使用vue-office插件实现word预览

首先, 我们先来创建一个Vue3项目 npm init vuelatest pnpm i npm run dev运行起来之后, 我们将App.vue中的代码全部删除掉 现在, 页面干净了, 我们需要安装vue-office插件 npm install vue-office/docx vue-demi安装完成之后, 我们就可以在页面中进行使用了 需要我们将组件…

边缘计算AI盒子目前支持的AI智能算法、视频智能分析算法有哪些,应用于大型厂矿安全生产风险管控

一、前端设备实现AI算法 主要是基于安卓的布控球实现&#xff0c;已有的算法包括&#xff1a; 1&#xff09;人脸&#xff1b;2&#xff09;车牌&#xff1b;3&#xff09;是否佩戴安全帽&#xff1b;4&#xff09;是否穿着工装&#xff1b; 可以支持定制开发 烟雾&#xf…

(免费分享)基于springboot,vue超市管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredis 本项目分为系统管理员、…

|行业洞察·手机|《2024手机行业及营销趋势报告-18页》

报告的主要内容解读&#xff1a; 手机行业概述及品牌分布&#xff1a; 2022年&#xff0c;受疫情影响&#xff0c;中国国内手机市场出货量下降22.6%&#xff0c;总计2.72亿部。5G手机市场占有率中&#xff0c;苹果领先&#xff0c;其次是vivo、OPPO和华为。消费者换机时更注重性…

鸿蒙OS开发实战:【悬浮窗口】

背景 悬浮视图或者窗体&#xff0c;在Android和iOS两大移动平台均有使用&#xff0c;HarmonyOS 也实现了此功能&#xff0c;如下为大家分享一下效果 准备 熟读HarmonyOS 悬浮窗口指导 熟读HarmonyOS 手势指导 熟读ALC签名指导&#xff0c;用于可以申请 “ohos.permission.S…

github | ssh拉取github仓库报错connect to host github.com port 22: Connection refused

配置ssh key 通过 ssh key 解决本地和服务器连接的问题 $ cd ~/. ssh #检查本机已存在的ssh密钥 如果提示 No such file or directory 则表示第一次使用git 输入&#xff1a; ssh-keygen -t rsa -C "邮件地址" 并且连续3次回车&#xff0c;最终会生成一个文件&am…

如何在Flutter中进行网络请求?

Hello&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff0c;你们的好朋友&#xff01;今天&#xff0c;我想和大家分享一下在Flutter中如何进行网络请求。Flutter作为一个跨平台的开发框架&#xff0c;网络请求是其实现数据交互的重要一环。下面&#xff0c;我将详细介绍几种…

JVM实战之性能调优[2](线程转储案例认识和分析)

文章目录 版权声明案例1&#xff1a;CPU占用率高问题问题描述解决思路补充内容 案例2&#xff1a;接口响应时间长问题问题描述解决思路Arthas trace命令Arthas watch命令解决问题 案例3&#xff1a;定位偏底层性能问题问题描述解决思路&#xff1a;Arthas火焰图问题解决 案例4&…

Siemens S7-1500TCPU 运动机构系统功能简介

目录 引言&#xff1a; 1.0 术语定义 2.0 基本知识 2.1 运动系统工艺对象 2.2 坐标系与标架 3.0 运动机构系统类型 3.1 直角坐标型 3.2 轮腿型 3.3 平面关节型 3.4 关节型 3.5 并联型 3.6 圆柱坐标型 3.7 三轴型 4.0 运动系统的运动 4.1 运动类型 4.1.1 线性运动…

ArcGIS Pro横向水平图例

终于知道ArcGIS Pro怎么调横向图例了&#xff01; 简单的像0一样 旋转&#xff0c;左转右转随便转 然后调整图例项间距就可以了&#xff0c;参数太多就随便试&#xff0c;总有一款适合你&#xff01; 要调整长度&#xff0c;就调整图例块的大小。完美&#xff01; 好不容易…

win10+cuda11.8+cudnn8.6.0安装

目录 一、NVIDIA 驱动程序下载 二、cuda11.8下载 三、cudnn8.6.0下载 四、确认cuda和cudnn是否安装成功 一、NVIDIA 驱动程序下载 1、查看显卡类型&#xff1a;连续按下CTRLALTDELETE -> 选择任务管理器 -> 性能 -> GPU -> 右上角 2、下载地址&#xff1a;官方…

阿里云CentOS7安装Hadoop3伪分布式

ECS准备 开通阿里云ECS 略 控制台设置密码 连接ECS 远程连接工具连接阿里云ECS实例&#xff0c;这里远程连接工具使用xshell 根据提示接受密钥 根据提示写用户名和密码 用户名&#xff1a;root 密码&#xff1a;在控制台设置的密码 修改主机名 将主机名从localhost改为需要…

iPhone用GPT替代Siri

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 前一段时间&#xff0c;因为iCloud协议的更新&#xff0c;我的云盘空间无法正常…

骗子查询系统源码

源码简介 小权云黑管理系统 V1.0 功能如下&#xff1a; 1.添加骗子&#xff0c;查询骗子 2.可添加团队后台方便审核用 3.在线反馈留言系统 4.前台提交骗子&#xff0c;后台需要审核才能过 5.后台使用光年UI界面 6.新增导航列表&#xff0c;可给网站添加导航友链 7.可添加云黑类…

Nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)

目录 Nginx和Sticky介绍 编译安装sticky的nginx环境 安装过程碰到的问题和编译安装过程遇到的错误&#xff1a; &#xff08;1&#xff09;第一个错误&#xff1a;修改源代码ngx_http_sticky_module.c &#xff08;2&#xff09;第二个错误&#xff1a;修改源代码ngx_http_s…

课堂练习——4、实验环境练习

任务描述 本关任务&#xff1a;修改 Linux 0.11 内核程序&#xff0c;将系统启动时显示的字符串由原来的Partition table ok.变为Hello, world!。 通过本关任务&#xff0c;可以熟悉 Linux 0.11 内核实验环境&#xff0c;掌握内核程序的编辑、编译和测试方法。 相关知识 为了…

Java基础(概念,环境,包,IDEA,)

目录 什么是Java 什么是程序 Java简史 Java技术体系平台 Java语言的特点 搭建环境 搭建Java开发环境 理解三个核心概念 安装Java环境 配置环境变量 编写第一段代码&#xff1a;HelloWorld 创建源代码文件 编写代码 保存文件 编译Java程序 运行程序 查看输出 编…

C#String的remove的用法

string test "abc";string temp test;temp.Remove(0, 1);temp temp.Remove(0, 1);Console.WriteLine(temp);Console.WriteLine(test);执行结果