裁剪图片原理

news2024/11/23 9:26:32

FileReader

HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。

创建实例

const reader = new FileReader();

方法

事件

 Blod

Blob是用来支持文件操作的。简单的说:在JS中,有两个构造函数 FileBlob, 而File继承了所有Blob的属性。

所以在我们看来,File对象可以看作一种特殊的Blob对象。

上面说了,File对象是一种特殊的Blob对象,那么它自然就可以直接调用Blob对象的方法。让我们看一看Blob具体有哪些方法,以及能够用它们实现哪些功能:

 Canvas中的ImageData对象

ImageData对象中存储着canvas对象真实的像素数据,它包含以下几个只读属性:

  • width:图片宽度,单位是像素
  • height:图片高度,单位是像素
  • dataUint8ClampedArray类型的一维数组,包含着RGBA格式的整型数据,范围在 0 至 255 之间(包括 255)。

创建一个ImageData对象

使用createImageData() 方法去创建一个新的,空白的ImageData对象。

const myImageData = ctx.createImageData(width, height);

上面代码创建了一个新的具体特定尺寸的ImageData对象。所有像素被预设为透明黑。

得到场景像素数据

为了获得一个包含画布场景像素数据的ImageData对象,可以用getImageData()方法:

const myImageData = ctx.getImageData(left, top, width, height);

在场景中写入像素数据

你可以用putImageData()方法去对场景进行像素数据的写入。

ctx.putImageData(myImageData, dx, dy);

toDataURL 将canvas转为 data URI格式

const canvas = document.getElementById('canvas');
const dataURL = canvas.toDataURL();
console.log(dataURL);

具体实现

第一步:获取文件并读取文件

const handleUpload = (event) => {
  let file = event.target.files[0];
  let fileReader = new FileReader();
  fileReader.onload = (e) => {
    imgUrl.value = e.target.result
    imageRef.value.onload = () => {
      drawImage()
    };
  };
  console.log(file)
  fileReader.readAsDataURL(file);
}

第二步:绘制canvas

const drawImage = () => {
  let image = imageRef.value;
  let canvas = canvasRef.value;
  let ctx = canvas.getContext("2d");
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  let imageWidth = image.width;
  let imageHeight = image.height;
  ctx.drawImage(
    image,
    0,
    0,
    imageWidth,
    imageHeight
  )
}

第三步:裁剪图片

getImageData里的x、y、width、height就是在裁剪图片时选定范围后能获得的值,因为不是裁剪图片的重点,就不展开说了。

const crop = () => {
  let canvas = canvasRef.value;
  let ctx = canvas.getContext('2d');
  const imageData = ctx.getImageData(x, y, width, height);

  let avatarCanvas = document.createElement('canvas');
  avatarCanvas.width = 100;
  avatarCanvas.height = 100;

  let avatarCtx = avatarCanvas.getContext('2d');
  avatarCtx.putImageData(imageData, 0, 0);

  let avatarDataUrl = avatarCanvas.toDataURL();
  clipeUrl.value = avatarDataUrl
}

总结

裁剪图片不难,总结起来就是分为以下两步。

  1. 监听选择文件的onchange事件,选择完图片之后onchange回调里的参数能拿到file对象,然后实例FileReader,FileReader类用于读取文件,包含readAsDataURL方法异步读取文件内容,比如图片base64,onload事件文件读取成功完成时触发,这样就能拿到上传图片的base64,用这个base64去new Image在onload的时候去绘画canvas,用canvas的drawImage把图片画进去,这样完成了第一步。
  2. 在用户选定了裁剪范围裁剪之后,用canvas的getImageData传入x、y、width、height获取画布裁剪范围内的像素数据,再建一个canvas把刚才获取的像素数据putImageData进去,最后toDataURL就能拿到裁剪之后图片的base64了。

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

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

相关文章

牛客每日一题(1/12)

233的字符串题目描述 读入一个正整数n,代表将字符串"abc"重复n次,形成一个长度为3n的字符串。例如n3时,形成的字符串为"abcabcabc"。请你计算该字符串中有多少个"acb"子序列。答案对10^97取模。输入描述:一个正…

【计算机网络-数据链路层】局域网(LAN)

文章目录1 局域网的概念1.1 局域网的拓扑结构1.2 局域网的传输介质1.3 局域网的介质访问控制方式(MAC)1.4 局域网的分类2 以太网(Ethernet,IEEE 802.3 标准)2.1 以太网的传输介质2.2 以太网的网卡2.3 以太网的 MAC 地址…

flutter apk 加固引发的问题

背景:Apk 加固,防止动态调试啥的,用的是 腾讯家的加固方案:应用加固,这个加固完之后 因为破壳了,所以需要重写签名;今天发现一个这样的问题:最早加固完毕安装不了提示:Failure IINST…

C语言从入门到放弃——静态通讯录实现

目录 一.功能实现 1.打印开始菜单 2.实现选择 3.初始化通讯录 4.添加、删除等功能实现 (1)添加联系人 (2)删除联系人 (3)查找联系人 (4)修改联系人 (5&#xff…

【C++】基于EasyX库的2048小游戏

文章目录0 前言1 先看一下最终的效果图2 2048核心2 EasyX库2.1 配色2.2 文字2.3 填充3 总结0 前言 最近比较迷2048小游戏,于是想自己写代码实现出来,恰好也在网上找到一个现成的2048的VS工程,但是界面做得很难看,且运行逻辑存在一…

研究发现,大多数长期 COVID 影响在感染后一年内消退

英国医学杂志今天发表的一项来自以色列的大型研究发现,轻度 COVID-19 感染后出现的大多数症状或病症会持续数月,但在一年内恢复正常。 特别是接种过疫苗的人,呼吸困难的风险较低。这通常也是轻度感染后最常见的影响。相比之下,比未…

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ977有序数组的平方暴力排序双指针法209长度最小的子数组暴力解法滑动窗口法59螺旋矩阵Ⅱ977有序数组的平方 题目链接:977 题目:给你一个按 非递减顺序 排序的整数数组 nums,返…

Linux常用命令——xargs命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xargs 给其他命令传递参数的一个过滤器 补充说明 xargs 命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道…

python--城堡保卫战

实现功能: 1:敌人的绵绵不断的前进,拿着各种各样的武器(叉子,斧头,宝剑),挥动武器攻击我方城堡,对我方城堡造成伤害! 2:我方城堡发现敌人可手动…

Linux-文件系统

Windows文件系统 在Windows下,打开“计算机”,我们看到的是一个个驱动盘符。 注意:盘符与硬件不是对应的,比如说电脑有有一块硬盘,到Windows下可以将其切成C、D、E盘,也就是一个硬盘可以放多个盘符。 Lin…

maple-example简单操作示例

好久都没写博客了,今天学习到一点新知识,在这里小编和大家分享,欢迎大家指点,这篇文章是关于 maple-example的简单操作示例,具体软件下载不做讲解,谢谢!

浅谈分辨率带宽RBW

频谱仪是射频工程师最常用的设备之一,信号的频率、功率、谐波、相位噪声等诸多射频参数都需要使用频谱仪测试。使用频谱仪时,有一个参数需要经常设置,就是分辨率带宽(Resolution BW,简称RBW)。RBW是指中频链路上最小的中频滤波器带…

Enhance the Visual Representation via Discrete Adversarial Training

在自然语言处理NLP中,AT可以从泛化中受益,我们注意到AT在NLP任务中的有优点可能来自于离散和符号输入空间。为了借鉴NLP风格AT的优势,我们提出了离散对抗训练(DAT)。DAT利用VQGAN将图像数据改为离散的类似文本的输入&a…

Vuex的学习内容

本教程使用的是vue3 1.核心概念 官网地址:https://vuex.vuejs.org/安装(固定)配置项(固定) 2. 图示关系 单一定义store对象,里面5个配置项,在任意组件可以使用. 3.案例准备 准备两个组件AddItem.vue、SubItem.vue、Main.vue 展示效果如下: AddItem代码 <template&…

STL - String容器

1. string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char *的区别&#xff1a; char *是一个指针 string是一个类&#xff0c;类内部封装了char *,管理这个字符串&#xff0c;是一个char *型的容…

本地小说阅读网站打造

目录 一、本地小说网站总体组织框架 1、所需的VUE库和elementLib以及JQ库 2、本地目录设计 3、整体代码样式 二、正文核心代码 1、引入element 样式&#xff0c;和自定义的样式 2、引入JS 3、自定义Header组件 1&#xff09;vue 定义MyHeader组件 2&#xff09;MyHead…

Mapstruct的具体介绍与使用

我是 ABin-阿斌&#xff1a;写一生代码&#xff0c;创一世佳话&#xff0c;筑一览芳华。 如果小伙伴们觉得我的文章不错&#xff0c;记得一键三连哦 文章目录一、mapstruct简介二、mapstruct与其他映射对比三、mapstruct底层原理解析1、Java动态编译四、具体使用1、依赖导入2、…

Linux开发工具的使用(三)

文章目录Linux开发工具的使用&#xff08;三&#xff09;1. 缓冲区1.1 理解\r和\n1.2 缓冲区的初步理解1.3 倒计时小程序实现1.4 进度条小程序实现2. 分布式版本控制系统-git使用2.1 git历史2.2 git版本控制理解2.3 git使用2.3.1 gitee搭建远程仓库2.3.2 开始配置3. Linux调试器…

Revit教程:创建“幕墙竖梃族”的方法步骤

幕墙竖梃族分为两个组成部分&#xff1a;“幕墙竖梃”和“公制轮廓-竖梃”&#xff0c;前者是基于后者轮廓的一个实体拉伸&#xff0c;两者的关系类似于实体与草图。轮廓族及门窗族 (公制门-幕墙&#xff0c;公制窗-幕墙而非公制门与公制窗)可以嵌套入CAD详图或Revit详图&#…

93、【树与二叉树】leetcode ——222. 完全二叉树的节点个数:普通二叉树求法+完全二叉树性质求法(C++版本)

题目描述 原题链接&#xff1a;222. 完全二叉树的节点个数 解题思路 1、普通二叉树节点个数求法 &#xff08;1&#xff09;迭代&#xff1a;层序遍历BFS 遍历一层获取一层结点 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode …