当前位置: 首页 > news >正文

前端开发攻略---图片裁剪上传的原理

目录

​编辑

1、预览本地图片

2、图片裁剪交互

3、上传裁剪区域


1、预览本地图片

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><input type="file" /><img class="preview" /></body><script>const ipt = document.querySelector('input')const img = document.querySelector('img')ipt.onchange = function (e) {const file = e.target.files[0] // 获取用户选择的第一个文件const fileReader = new FileReader() // 创建一个新的 FileReader 对象,用于读取文件。fileReader.onload = e => {// 当文件读取完成后,e.target.result 将包含文件的 URL,赋值给 <img> 元素的 src 属性,从而显示图片img.src = e.target.result}fileReader.readAsDataURL(file)//   console.log(file)}</script>
</html>

2、图片裁剪交互

裁剪交互比较简单,这里不在叙述。

3、上传裁剪区域

思路:

  1. 通过交互后的结果,获取到裁剪的宽度、高度、位置
  2. 根据这些参数通过canvas画出来
  3. 将canvas转换blob,再讲blob转换为file
  4. 将file对象上传到服务器

核心代码:

    function uploadCutResult({ cutWidth, cutHeight, cutX, cutY }) {const cvs = document.createElement('canvas')cvs.width = 200cvs.height = 200const ctx = cvs.getContext('2d')ctx.drawImage(img, cutX, cutY, cutWidth, cutHeight, 0, 0, cvs.width, cvs.height)cvs.toBlob(blob => {// 拿到file对象const file = new File([blob], 'cut-png', { type: 'image/png' })console.log(file)})}

全部代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><input type="file" /><img class="preview" /><button>模拟交互结果</button></body><script>const ipt = document.querySelector('input')const img = document.querySelector('img')const btn = document.querySelector('button')ipt.onchange = function (e) {const file = e.target.files[0]const fileReader = new FileReader()fileReader.onload = e => {img.src = e.target.result}fileReader.readAsDataURL(file)//   console.log(file)}function uploadCutResult({ cutWidth, cutHeight, cutX, cutY }) {const cvs = document.createElement('canvas')cvs.width = 200cvs.height = 200const ctx = cvs.getContext('2d')ctx.drawImage(img, cutX, cutY, cutWidth, cutHeight, 0, 0, cvs.width, cvs.height)cvs.toBlob(blob => {// 拿到file对象const file = new File([blob], 'cut-png', { type: 'image/png' })console.log(file)})}// 模拟裁剪后的结果btn.onclick = function () {uploadCutResult({ cutHeight: 100, cutWidth: 200, cutX: 10, cutY: 10 })}</script>
</html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Hackademic.RTB1靶场实战【超详细】
  • S71200 - 编程 - 笔记
  • ZooKeeper 集群的详细部署
  • eNSP 华为三层交换机实现VLAN间通信
  • 【课程总结】day23:大模型训练策略(BERT模型与GLM模型)
  • 【若依 - 前后端不分离版】SysCaptchaController 详解:生成与处理验证码
  • springboot2.x到spring3.x的一些变化和示例说明
  • 花钱买不到系列之—linux系统调用
  • 嵌入式学习Day29---Linux软件编程---网络编程
  • 力扣--最长公共前缀
  • C++ 对象构造语义学——局部对象、全局对象的构造和析构
  • MINIO图片地址浏览器打开不显示
  • python中的列表、元组、字典之间的区别
  • 刑法学学习笔记(个人向) Part.1
  • haproxy 7000字配图超详细教程 从小白到入门
  • JavaScript-如何实现克隆(clone)函数
  • (三)从jvm层面了解线程的启动和停止
  • 【前端学习】-粗谈选择器
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Spring框架之我见(三)——IOC、AOP
  • Vue 2.3、2.4 知识点小结
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 简单数学运算程序(不定期更新)
  • 码农张的Bug人生 - 见面之礼
  • 事件委托的小应用
  • 树莓派 - 使用须知
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 系统认识JavaScript正则表达式
  • 源码安装memcached和php memcache扩展
  • 再次简单明了总结flex布局,一看就懂...
  • FaaS 的简单实践
  • scrapy中间件源码分析及常用中间件大全
  • 积累各种好的链接
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $forceUpdate()函数
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2022 CVPR) Unbiased Teacher v2
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (定时器/计数器)中断系统(详解与使用)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (学习日记)2024.01.19
  • (一)80c52学习之旅-起始篇
  • (一)SvelteKit教程:hello world
  • (转)nsfocus-绿盟科技笔试题目
  • .NET Core引入性能分析引导优化
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .Net开发笔记(二十)创建一个需要授权的第三方组件