canvas图片旋转,图片base64编码,保存图片

news2024/11/24 16:10:29

在一些业务场景中,常常需要前端对图片进行操作,这样可以将部分的性能压力转移到前端设备,有利于减小服务器压力,下面讲解前端怎么操作图片。

首先,对图片的操作都是依赖于canvas画布,这里对canvas标签不再赘述,无论在小程序、H5、PC,各种前端框架都会有canvas的方法,或基于canvas的封装,在环境方面我们无需担心,只需要注意调用 Api 不同,实现相同的功能。其次,对图片的各种操作也会在下面讲到。

这个是原图可以下载下来作测试用
美少女战士图片



1、前期的简单认识

对canvas的简单认识

  1. 默认坐标原点 (0,0) 在左上角,X坐标向右方延伸,Y坐标向下方延伸

  2. 如果对画布进行旋转,坐标系也会跟着旋转

  3. 坐标系是可以进行坐标系变换的,即原点、X轴方向、Y轴可变

  4. 在canvas上绘制图像,图像必须加载完毕,否则会出现空白

<html>
<body>
  <canvas id="canvas" />
</body>
<script>
  let canvas = document.getElementById("canvas")
  canvas.width = 200
  canvas.height = 200

  let ctx = canvas.getContext("2d")
  ctx.fillStyle = 'pink';
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = 'red';
  ctx.font = "30px Arial";
  ctx.fillText("Hello World", 10, 50);
</script>
</html>

** 对image的简单认识**

  1. new Image() 可以构造<img>标签

  2. <img>标签src属性赋值可以引入图片资源

  3. 图像必须加载完毕后才能拿到图片渲染后的信息,比如宽高

//下面是一个获取图片宽高的例子
  let img = new Image();
  
  img.src = "./pic.jpeg";

  img.onload = function () {
    console.log(img.width, img.height);
  }


2、canvas绘制图片

在 canvas 上绘制图像,可以使用 drawImage() 方法,具体参数查看MDN

  • drawImage(image, dx, dy) 在画布指定位置绘制原图

  • drawImage(image, dx, dy, dw, dh) 在画布指定位置上按原图大小绘制指定大小的图

  • drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) 剪切图像,并在画布上定位被剪切的部分

目前使用到的就是 drawImage(image, dx, dy, dw, dh)

  let canvas = document.getElementById("canvas")
  let ctx = canvas.getContext("2d")

  let img = new Image();
  img.src = "./pic.jpeg";
  img.onload = function () {
    let { width, height } = img
    canvas.width = width
    canvas.height = height
    ctx.drawImage(img, 0, 0)
  }

在这里插入图片描述



3、canvas旋转图片

在上一个例子中,图片需要逆时针旋转90度才能摆正,所以我们需要将画布逆时针旋转,并且要让画布在canvas中位置正确,不然会出现旋转过后图片消失或者被截取,因为canvas只会绘制在它宽高内的内容 注意,如果需要进行连续的旋转,步骤会更复杂,可以每次旋转都重置画布

  let canvas = document.getElementById("canvas")
  let ctx = canvas.getContext("2d")

  let img = new Image();
  img.src = "./pic.png";
  img.onload = function () {
    let { width, height } = img
    // canvas交换宽高
    canvas.width = height
    canvas.height = width
    // 图片逆时针旋转90度后
    ctx.rotate(-90 * Math.PI / 180);
    // 旋转后调整绘制的位置下移一个宽度的距离
    ctx.drawImage(img, -width, 0)
  }

在这里插入图片描述



4、图片转译base64格式

转移base64方法有很多,大概就是读取文件的API类作转换

这里我们其实可以直接使用canvas的方法

// 使用canvas.toDataURL,传参控制输入类型 、质量
  let canvas = document.getElementById("canvas")
  let ctx = canvas.getContext("2d")

  let img = new Image();
  img.src = "./pic.png";

  img.onload = function () {
    let { width, height } = img
    canvas.width = width
    canvas.height = height
    ctx.drawImage(img, 0, 0)
    // 转编译一定要在图像绘制完毕以后
    let base64= canvas.toDataURL("image/jpeg", 1)
    console.log(base64)
  }

在这里插入图片描述



5、canvas生成图片保存到本地

这里使用<a>标签的download属性进行下载,步骤就是创建一个a标签再触发点击事件保存到本地,最后移除a标签

  let canvas = document.getElementById("canvas")
  let ctx = canvas.getContext("2d")
  
  let img = new Image();
  img.src = "./pic.png";

  img.onload = function () {
    let { width, height } = img
    canvas.width = width
    canvas.height = height
    ctx.drawImage(img, 0, 0)
    let base64 = canvas.toDataURL("image/jpeg", .5)
    // 保存到本地
    let a = document.createElement("a");
    a.href = base64
    a.download = "美少女战士"
    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
  }

在这里插入图片描述

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

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

相关文章

华为OD机试题【字符统计】【2023 B卷 100分】

文章目录 &#x1f3af; 前言&#x1f3af; 题目描述&#x1f3af; 解题思路&#x1f4d9; Python代码实现&#x1f4d7; Java代码实现&#x1f4d8; C语言代码实现 &#x1f3af; 前言 &#x1f3c6; 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最…

LVGL学习(3):页面切换原理和页面管理实现

在LVGL中&#xff0c;大多情况下是有多个页面的&#xff0c;一般来说页面的切换有两种情况&#xff1a; 删除当前的页面&#xff0c;创建新页面加载保留当前的页面&#xff0c;创建新页面加载 我们来分析一下这两种情况&#xff0c;比如页面1有一个列表框&#xff0c;有三个选…

VESC操作入门(三)——PPM输入控制和ADC输入控制

目录 一、PPM输入控制1.1、硬件准备1.2、PPM信号1.3、校准电机1.4、输入设置 二、ADC输入控制2.1、硬件准备2.2、更改固件2.3、电压信号2.4、校准电机2.5、输入设置 三、电动车转把控制3.1、转把说明3.2、转把测试 四、ADC的其它模式4.1、Current No Reverse Brake ADC24.2、Cu…

Windows 安装Redis教程(图文详解)_下载使用redis_Redis可视化_配置Redis环境变量

下载、安装和配置 给出自己的百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14uO7jSm0DuoBWBaFO-obTw 提取码&#xff1a;1234 1. Redis下载 由于 Redis 官网没有提供 windows 版本的&#xff0c;只能去 github 上下载。 1、下载地址&#xff1a;github链…

【C/C++】基础知识之bool布尔类型

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Java 服务端生成动态 Word 文档下载

需求&#xff1a;某些合同&#xff0c;被制作成模板&#xff0c;以 Word 格式保存&#xff0c;输入相关的内容参数最终生成 Word 文档下载。这是企业级应用中很常见的需求。 解决方案&#xff1a;无非是模板技术&#xff0c;界定不变和变的内容&#xff0c;预留插值的标记&…

创新书荐|《影响力经济》如何在社交媒体上寻求可信的影响力

在这个越来越不可预测的经济体中&#xff0c;贫富悬殊、大规模裁员等让许多人都觉得踏上稳定的职业道路遥不可及&#xff0c;自由职业听起来是最好的选择。宾夕法尼亚大学研究人员Emily Hund在她的新书《影响力经济》很好地讲述了年轻创意人士如何将互联网从分散的网页集合转变…

【目标检测——YOLO系列】YOLOv1 —《You Only Look Once: Unified, Real-Time Object Detection》

YOLOv1 —《You Only Look Once: Unified, Real-Time Object Detection》 论文地址&#xff1a;1506.02640] You Only Look Once: Unified, Real-Time Object Detection (arxiv.org) 代码地址&#xff1a;pjreddie/darknet: Convolutional Neural Networks (github.com) 1、Y…

log4j 2自动配置的优先级顺序

log4j 2按照下面优先级由高到低的顺序查找使用日志的配置&#xff1a; 1、系统变量log4j2.configurationFile中指明的配置文件&#xff1b; 2、类路径上的log4j2-test.properties配置文件&#xff1b; 3、类路径上的log4j2-test.yaml 或者 log4j2-test.yml配置文件&#xff1b;…

【C++】C++中的I/O类总结——上篇

title: 【C】C-中的I/O类总结 tags: C description: ’ ’ categories: C date: 2023-06-05 00:36:59 引入 #include <iostream>int main(){std::cout<<"Hello World!"<<std::endl;}我们在学习C时&#xff0c;往往都是从上面这段程序开始的 也就…

React - Mobx

Mobx 简介 mobx是一个可以和React良好配合的集中状态管理工具&#xff0c;和Redux解决的问题相似&#xff0c;都可以独立组件进行集中状态管理 优势 简单 编写无模板的极简代码精准描述你的意图 轻松实现最优渲染 依赖自动追踪&#xff0c;实现最小渲染优化 架构自由 可…

Flutter - 一行命令解决多个pubspec.yaml文件的依赖项问题

文章目录 前言开发环境Flutter内置命令一行命令实现1. 命令使用2. 命令解释3. 命令扩展 最后 前言 项目为了模块化&#xff0c;创建了一堆Package和Plugin&#xff0c;这么做没什么问题&#xff0c;但是遇到Flutter SDK目录路径变化或者其他一些情况导致需要重新获取依赖项时就…

50+常用的广告联盟术语 (常用缩写)

广告联盟术语是指与广告联盟业务有关的行话和缩写。这些术语通常用于描述商业模型、营销策略、流量源、收益模型等方面的概念。了解广告联盟术语对于广告主、联盟会员、广告服务提供商等参与者都非常重要&#xff0c;因为它们可以帮助他们更好地理解广告联盟业务&#xff0c;提…

IDEA 2022.3.3 创建SpringBoot项目

目录 步骤01&#xff1a;快速创建项目 步骤02&#xff1a;选择依赖 步骤03&#xff1a;pom文件中版本问题 ​步骤04&#xff1a;启动测试 4.1、认识引导类 4.2、创建Controller类进行测试 可能遇到的问题及解决方案 附件1&#xff1a;pom文件源码 附件2&#xff1a;项…

华为OD机试题【食堂供餐】【2023 B卷 100分】

文章目录 &#x1f3af; 前言&#x1f3af; 题目描述&#x1f3af; 解题思路&#x1f4d9; Python代码实现&#x1f4d7; Java代码实现&#x1f4d8; C语言代码实现 &#x1f3af; 前言 &#x1f3c6; 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最…

Python使用正则表达式识别代码中的中文、英文和数字实例演示

Python 正则表达式识别代码中的中文、英文和数字 识别中文识别英文识别数字拓展 在文本处理和数据分析中&#xff0c;有时候需要从代码中提取出其中包含的中文、英文和数字信息。正则表达式是一种强大的工具&#xff0c;可以帮助我们实现这一目标。本文将分三个部分详细介绍如何…

chatgpt赋能python:Python如何倒序输出一组数

Python如何倒序输出一组数 Python是一种广泛使用的高级编程语言&#xff0c;由于其易读性和简洁性&#xff0c;Python已成为Web开发、数据分析以及人工智能等方向的首选语言。而在程序编写过程中&#xff0c;倒序输出一组数也是一个经常用到的操作。在本文中&#xff0c;我们将…

ActiveReportsJS 4.0.2 Crack ActiveReportsJS New

ActiveReportsJS - 高级 JavaScript 报告解决方案 ActiveReportsJS 是一个强大的 Web 应用程序报告工具&#xff0c;它允许开发人员和报告作者轻松地在他们的应用程序中设计和显示报告。凭借广泛的功能&#xff0c;例如向下钻取、运行时数据过滤和参数驱动的报告&#xff0c;以…

基于时间的访问控制列表(ACL)配置实验

基于时间的访问控制列表&#xff08;ACL&#xff09;配置实验 【实验目的】 掌握基于时间的ACL配置。认识给予时间的ACL的作用。验证配置。 【实验拓扑】 实验拓扑如下图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255…

24万字智慧城市时空信息云平台 大数据一体化 解决方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除篇幅有限&#xff0c;无法完全展示&#xff0c;喜欢资料可转发评论&#xff0c;私信了解更多信息。 第二章 XX新型智慧城市总体设计 2.1 新型智慧城市核心技术 2.2 新型智慧城…