移动端手签-图片base64旋转功能

记录一个方法用于移动端横屏画布的旋转图片功能。
核心代码:

 rotateBase64(data) {return new Promise((resolve) => {const imgView = new Image();imgView.src = data;const canvas = document.createElement('canvas');const context = canvas.getContext('2d');const cutCoor = { sx: 0, sy: 0, ex: 0, ey: 0 }; // 裁剪坐标imgView.onload = () => {const imgW = imgView.width;const imgH = imgView.height;const size = imgH;canvas.width = size * 2;canvas.height = size * 2;cutCoor.sx = size;cutCoor.sy = size - imgW;cutCoor.ex = size + imgH;cutCoor.ey = size + imgW;context.translate(size, size);context.rotate(Math.PI / 2 * 3);context.drawImage(imgView, 0, 0);const imgData = context.getImageData(cutCoor.sx, cutCoor.sy, cutCoor.ex, cutCoor.ey);canvas.width = imgH;canvas.height = imgW;context.putImageData(imgData, 0, 0);resolve(canvas.toDataURL('image/png'));};});}

整体功能:

import React, { Component } from 'react';
import styles from './index.less';
import { connect } from 'react-redux';
import bindDispatchToPromise from '@/constants/bindDispatchToPromise';
import SignaturePad from 'signature_pad'
import { Button, Toast } from 'antd-mobile';import {SIGNATURE,
} from "@/reducers/registrationInfo";@connect((state) => {return {}
})
class BaseInfo extends Component {signaturePad = null; constructor(props) {super(props)let {match: { params },} = this.props;this.state = {hasSometing: false  // 画布上是否有东西}}componentDidMount() {this.init()}init = () => {const _canvas = document.querySelector("#signature");const winW = window.innerWidth;const winH = window.innerHeight;_canvas.width = winW;_canvas.height = winH;const signaturePad = new SignaturePad(_canvas, {minWidth: 3,maxWidth: 3,penColor: "#000",});// 添加操作事件signaturePad.addEventListener('endStroke', this.onEndStroke);this.signaturePad = signaturePad;}onEndStroke = () => {if (!this.state.hasSometing) {this.setState({hasSometing: true});}}handleClear = () => {this.signaturePad?.clear();this.setState({hasSometing: false});}rotateBase64(data) {return new Promise((resolve) => {const imgView = new Image();imgView.src = data;const canvas = document.createElement('canvas');const context = canvas.getContext('2d');const cutCoor = { sx: 0, sy: 0, ex: 0, ey: 0 }; // 裁剪坐标imgView.onload = () => {const imgW = imgView.width;const imgH = imgView.height;const size = imgH;canvas.width = size * 2;canvas.height = size * 2;cutCoor.sx = size;cutCoor.sy = size - imgW;cutCoor.ex = size + imgH;cutCoor.ey = size + imgW;context.translate(size, size);context.rotate(Math.PI / 2 * 3);context.drawImage(imgView, 0, 0);const imgData = context.getImageData(cutCoor.sx, cutCoor.sy, cutCoor.ex, cutCoor.ey);canvas.width = imgH;canvas.height = imgW;context.putImageData(imgData, 0, 0);resolve(canvas.toDataURL('image/png'));};});}handleSubmit = async () => {const {hasSometing} = this.state;console.log("hasSometing", hasSometing)if (!hasSometing) {Toast.show({content: "请先签名"})return}const data = this.signaturePad.toDataURL();const base64 = await this.rotateBase64(data)console.log('base64 ',base64 )// 最后正向旋转的图片}handleGoBack = () => {this.props.history.goBack();}render() {let {} = this.statereturn (<div className={styles.body}><canvasid="signature"className={styles.canvas}></canvas><div className={styles.footer}><Button className={styles.btn} onClick={this.handleGoBack}>返回</Button><Button color="primary" onClick={this.handleClear} className={styles.btn} >清空</Button><Button color="primary" onClick={this.handleSubmit} className={styles.btn} >确认</Button></div></div>)}
}export default BaseInfo;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型(LLM)框架及微调 (Fine Tuning)

大语言模型&#xff08;LLM&#xff09; 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法&#xff0c;…

【网络安全】全网最全的渗透测试介绍(超详细)

渗透测试介绍 渗透测试就是模拟攻击者入侵系统&#xff0c;对系统进行一步步地渗透&#xff0c;发现系统地脆弱环节和隐藏风险。最后形成测试报告提供给系统所有者。系统所有者可根据该测试报告对系统进行加固&#xff0c;提升系统的安全性&#xff0c;防止真正的攻击者入侵。…

【Unity】【FBX】如何将FBX模型导入Unity

【背景】 网上能够找到不少不错的FBX模型资源&#xff0c;大大加速游戏开发时间。如何将这些FBX导入Unity呢&#xff1f; 【步骤】 打开Unity项目文件&#xff0c;进入场景。 点击Projects面板&#xff0c;右键选择Import New Assets 选中FBX文件后导入。Assets文件夹中就会…

【网络安全】upload靶场pass1-10思路

目录 Pass-1 Pass-2 Pass-3 Pass-4 Pass-5 Pass-6 Pass-7 Pass-8 Pass-9 Pass-10 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1…

求解拍频的信号特征

这张图上&#xff0c;时域已经明显产生调幅波的拍频特征。利用宏观的拍频特征可以肉眼识读两个信号的频差&#xff1a; 一秒是69.42个像素。拍频周期是&#xff1a;21.857像素。所以&#xff0c;拍频的周期是&#xff1a;3.7161Hz. 其中一个频率是50Hz&#xff0c;另一个频率…

C# Winform教程(二):基础窗口程序

1、介绍 winform应用程序是一种智能客户端技术&#xff0c;我们可以使用winform应用程序帮助我们获得信息或者传输信息等。 2、常用属性 Name&#xff1a;在后台要获得前台的控件对象&#xff0c;需要使用Name属性。 Visible&#xff1a;指示一个控件是否可见、 Enable&…

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果 0. 背景1. 验证环境说明2. 验证开始2-1. 准备测试数据库2-2. 读取环境配置信息2-3. 导入依赖包2-3. 创建 SQLDatabaseToolkit 对象和 AgentExecutor 对象2-4. 第1个测试 - 描述一个表2-5. 第2个测…

算法训练第五十三天|1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列&#xff1a; 题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对…

OpenStack优缺点并与CloudStack的比较

文章目录 OpenStack的优势&#xff1a;OpenStack的缺陷&#xff1a;OpenStack和CloudStack OpenStack的优势&#xff1a; 控制性&#xff1a; OpenStack是一个开源平台&#xff0c;不会受到特定厂商的绑定和限制。其模块化设计使其能够集成遗留和第三方技术&#xff0c;满足不同…

手机怎么下载python并安装,如何在手机上下载python

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;如何在手机上下载python 3.7版本&#xff0c;手机怎么下载python并安装&#xff0c;现在让我们一起来看看吧&#xff01; 如何在手机上下载python 应用市场内搜索下载下载Python在您开始之前&#xff0c;在你的计算机将…

JS之日期对象Date

让我为大家介绍一下日期对象吧&#xff01; 日期对象&#xff0c;用来表示时间的对象 1.获取当前时间 // 获取当前时间let date new Date()2.指定时间 // 指定时间let date new Date("2023-6-1 08:30:30")日期对象的方法 因为我们日期对象返回的数据我们不能直接使…

【leetcode100-025】【链表/快慢指针】环形链表

【题干】 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

myBatis-CRUD

上接入门案例&#xff08;看之前的《mybatis基本介绍及入门案例》篇&#xff09; 1、映射接口 public interface MonsterMapper {//添加方法public void addMonster(Monster monster);public void delMonster(Integer monster_id);public void updateMonster(Monster monster)…

软件测试/测试开发丨Python 虚拟环境及pip环境管理

venv 虚拟环境管理 venv 虚拟环境的优点 独立的 Python 环境&#xff0c;不会产生冲突有助于包的管理删除和卸载方便 venv 使用方法 创建虚拟环境 python3 -m venv test 激活虚拟环境 切换指定文件夹Windows&#xff1a;/Scripts/macOS&#xff1a;/bin/ 执行指令&#xff…

使用conda在Windows上建立虚拟环境

一&#xff1a;介绍 Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。它适用于多种语言&#xff0c;如Python、R、Scala、Java、Javascript、C/ C和FORTRAN。Conda安装时默认随Miniconda或…

如何在 TypeScript 中定义类

在 TypeScript 中&#xff0c;你可以使用 class 关键字来定义一个类。下面是一个简单的示例&#xff0c;展示了如何定义一个名为 Person 的类&#xff1a; class Person {// 类的属性name: string;age: number;// 类的构造函数constructor(name: string, age: number) {this.n…

欢迎来到Web3.0的世界:Solidity智能合约安全漏洞分析

智能合约概述 智能合约是运行在区块链网络中的一段程序&#xff0c;经由多方机构自动执行预先设定的逻辑&#xff0c;程序执行后&#xff0c;网络上的最终状态将不可改变。智能合约本质上是传统合约的数字版本&#xff0c;由去中心化的计算机网络执行&#xff0c;而不是由政府…

深入探索Java中的UDP网络通信机制

在网络通信中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的协议&#xff0c;它在某些情况下比TCP更适合&#xff0c;尤其是在要求速度快、对数据准确性要求相对较低的场景下。本文将介绍如何使用Java进行UDP网络通信…

MIT 6.S081---Lab util: Unix utilities

环境搭建 基本环境 选择的是Vmwareubuntu的配置&#xff0c;注意ubuntu的版本一定要是20.04&#xff0c;作者试过16版本&#xff0c;不行&#xff0c;建议直接安装20.04版&#xff0c;不然环境配置都浪费不少时间有点得不偿失。&#xff08;Vmware可以用Virtualbox代替&#…