前端压缩图片为指定宽高

news2024/11/27 1:14:50

压缩图片原理

  1. 通过原生的input标签拿到要上传的图片文件
  2. 将图片文件转化成img元素标签
  3. 在canvas上压缩绘制该HTMLImageElement
  4. 将图片转化为一个包含图片展示的data URI,即图片被转换成base64编码的字符串

实现

通过原生的input标签拿到上传的图片文件

  1. css部分
    <input
      ref="image"
      type="file"
      accept="image/*"
      @change="getFile"
    />
    
  2. 图片上传后通过以下代码拿到上传的图片文件,这里拿到的为FileList文件对象数组,如下图所示。因为我们这里是单文件上传,因此直接取数组中第一个file对象就是我们上传的图片文件
    this.$refs.image.files[0]
    
    在这里插入图片描述

将图片文件转化成img元素标签

  1. 由于通过input拿到的文件是file对象类型的,在压缩之前需要转化为img对象,通过以下方法即可

    fileToImg (file) {
      return new Promise((resolve, reject) => {
        const img = new Image()
        const reader = new FileReader()
        reader.onload = function (e) {
          img.src = e.target.result
        }
        reader.onerror = function (e) {
          reject(e)
        }
        reader.readAsDataURL(file)
        img.onload = function () {
          resolve(img)
        }
        img.onerror = function (e) {
          reject(e)
        }
      })
    }
    

在canvas上压缩绘制该HTMLImageElement,将图片转换成base64编码的字符串

  1. 将图片转化为img对象后,就可以创建canvas对象,在canvas上压缩绘制合适宽高的图片。这里分为两种情况:

    1. 将图片压缩为指定高度
    /**
     * 压缩图片
     * @param img 被压缩的img对象
     * @param height 触发压缩的图片固定高度
     */
    compressImgHeight (img, height) {
      return new Promise((resolve) => {
      	// 创建canvas对象
        const canvas = document.createElement('canvas')
    
        const context = canvas.getContext('2d')
    	// 获取上传的img图片对象的宽度和高度
        const { width: originWidth, height: originHeight } = img
    
        // 绘制图片的高度
        canvas.height = height
    	// 根据绘制图片的高度,等比例计算图片的宽度
        canvas.width = (originWidth * canvas.height) / originHeight
    
        // 将img绘制到画布上
        context.drawImage(img, 0, 0, canvas.width, canvas.height)
    
        // 转为一个包含图片展示的data URI,即图片被转换成base64编码的字符串,格式为jpeg
        // 0.8为图片质量,区间为0~1,默认0.92
        resolve(canvas.toDataURL('image/jpeg', 0.8))
      })
    },
    
    1. 将图片压缩为指定宽度
    /**
     * 压缩图片
     * @param img 被压缩的img对象
     * @param width 触发压缩的图片固定宽度
     */
    compressImgHeight (img, width) {
      return new Promise((resolve) => {
      	// 创建canvas对象
        const canvas = document.createElement('canvas')
    
        const context = canvas.getContext('2d')
    	// 获取上传的img图片对象的宽度和高度
        const { width: originWidth, height: originHeight } = img
    
        // 绘制图片的宽度
        canvas.width = width
    	// 根据绘制图片的宽度,等比例计算图片的高度
        canvas.height = (originHeight * canvas.width) / originWidth
    
        // 将img绘制到画布上
        context.drawImage(img, 0, 0, canvas.width, canvas.height)
    
        // 转为一个包含图片展示的data URI,即图片被转换成base64编码的字符串,格式为jpeg
        // 0.8为图片质量,区间为0~1,默认0.92
        resolve(canvas.toDataURL('image/jpeg', 0.8))
      })
    }
    

总结

  1. 将以上代码进行总结
    // css部分
    <input
      ref="image"
      type="file"
      accept="image/*"
      @change="getFile"
    />
    
    
    // js部分
    getFile () {
      this.readImg(this.$refs.image.files[0]).then(res => {
      	// 压缩图片为指定宽度
        this.compressImgHeight(res, 300).then(img => {
          // 输出压缩后的图片base64
          console.log(img)
        })
      })
    }
    
    /**
     * 将图片file对象转化为img对象
     * @param file 图片file对象
     */
    fileToImg (file) {
      return new Promise((resolve, reject) => {
        const img = new Image()
        const reader = new FileReader()
        reader.onload = function (e) {
          img.src = e.target.result
        }
        reader.onerror = function (e) {
          reject(e)
        }
        reader.readAsDataURL(file)
        img.onload = function () {
          resolve(img)
        }
        img.onerror = function (e) {
          reject(e)
        }
      })
    },
    
    /**
     * 压缩图片为指定宽度
     * @param img 被压缩的img对象
     * @param width 触发压缩的图片固定宽度
     */
    compressImgWidth (img, width) {
      return new Promise((resolve) => {
      	// 创建canvas对象
        const canvas = document.createElement('canvas')
    
        const context = canvas.getContext('2d')
    	// 获取上传的img图片对象的宽度和高度
        const { width: originWidth, height: originHeight } = img
    
        // 绘制图片的宽度
        canvas.width = width
    	// 根据绘制图片的宽度,等比例计算图片的高度
        canvas.height = (originHeight * canvas.width) / originWidth
    
        // 将img绘制到画布上
        context.drawImage(img, 0, 0, canvas.width, canvas.height)
    
        // 转为一个包含图片展示的data URI,即图片被转换成base64编码的字符串,格式为jpeg
        // 0.8为图片质量,区间为0~1,默认0.92
        resolve(canvas.toDataURL('image/jpeg', 0.8))
      })
    },
    
    /**
     * 压缩图片为指定高度
     * @param img 被压缩的img对象
     * @param height 触发压缩的图片固定高度
     */
    compressImgHeight (img, height) {
      return new Promise((resolve) => {
      	// 创建canvas对象
        const canvas = document.createElement('canvas')
    
        const context = canvas.getContext('2d')
    	// 获取上传的img图片对象的宽度和高度
        const { width: originWidth, height: originHeight } = img
    
        // 绘制图片的高度
        canvas.height = height
    	// 根据绘制图片的高度,等比例计算图片的宽度
        canvas.width = (originWidth * canvas.height) / originHeight
    
        // 将img绘制到画布上
        context.drawImage(img, 0, 0, canvas.width, canvas.height)
    
        // 转为一个包含图片展示的data URI,即图片被转换成base64编码的字符串,格式为jpeg
        // 0.8为图片质量,区间为0~1,默认0.92
        resolve(canvas.toDataURL('image/jpeg', 0.8))
      })
    }
    

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

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

相关文章

Linux 通过监控监控系统内存并定时重启指定服务

一、使用Free命令监控系统内存 1.1 查看系统内存情况 free -m1.1.1 获取空闲物理内存 echo Mem-free: `free -m | grep Mem | awk {print $4}`M1.1.2 获取缓冲区内存

php 安装curl扩展支持sftp协议

原因&#xff1a;php默认安装的依赖的libcurl.so中不支持sftp 协议 解决方法&#xff1a;先安装libssh2&#xff0c;curl安装时编译参数带–with-libssh2&#xff0c;这样可以支持sftp 一.编译安装libssh2-1.8.0 1.下载源码 地址: https://github.com/libssh2/libssh2 2.编译…

requests页面常用操作(post、put、get、head、patch、delete方法)

1 requests主要方法2 请求返回信息3 应用3.1 登录页面3.2 退出登录3.3 修改参数3.4 上传文件Requests 是一个 Python 的 HTTP 客户端库。每次调用 requests 请求之后&#xff0c;会返回一个 response 对象&#xff0c;该对象包含了具体的响应信息。可以通过requests模拟提交请求…

蓝桥杯 stm32 实现 ADC 采集数据功能 CubeMX

文章内的代码使用 HAL 库。 ADC 即 模数转换器&#xff0c;是指 将 连续变化的模拟信号 转换成 离散的数字信号 的器件。 文章目录前言一、ADC 原理图二、CubeMX 配置三、ADC 代码讲解总结前言 一、ADC 原理图 从原理图我们可以看到 STM32G431 内部集成 两个 最高位 12 位 的 A…

通信电子、嵌入式类面试题刷题计划03

文章目录021——"Hello, world!"022——计算圆的面积023——打印10x10的星号024——字符串打印025——打印26个英文字母026——strlen函数的用法027——sizeof函数的使用028——if else、变量赋值语句029——if else语句030——if elseif else语句&#xff0c;判断是…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 ( 七)求两个数的差值

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;七&#xff09;求两个数的差值 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a;牛客Ve…

Redis作为缓存应用场景分析

为什么使用缓存 Redis是一个内存型数据库&#xff0c;也就是说&#xff0c;所有的数据都会存在与内存中&#xff0c;基于Redis的高性能特性&#xff0c;我们将Redis用在缓存场景非常广泛。使用起来方便&#xff0c;响应也是远超关系型数据库。 应用场景 Redis的应用场景非常…

绝了,超越YOLOv7、v8,YOLOv6 v3.0正式发布

超越YOLOv7、v8! YOLOv6 v3.0正式发布!!! YOLOv6 全新版本v3.0正式发布&#xff01;引入新的网络架构和训练方案&#xff0c;其中YOLOv6-S以484 FPS的速度达到45.0% AP&#xff0c;超过YOLOv5-S、YOLOv8-S&#xff0c;其代码刚刚开源 由于前段时间Ultralytics公司透露出V8的发…

马哥架构第2周课程作业

haproxy、nginx、lvs负责均衡相关的话题一. nginx和haproxy的异同点二. 实现haproxy四层地址透传&#xff0c;并且做基于cookie的会话保持2.1 haproxy四层地址透传2.2 基于cookie的会话保持2.2.1 配置选项2.2.2 配置示例2.2.3 验证 Cookie 信息三. 实现自定义错误页面和https的…

【学习笔记】【Pytorch】12.损失函数与反向传播

【学习笔记】【Pytorch】12.损失函数与反向传播一、损失函数的介绍1.L1Loss类的使用代码实现2.MSELoss类的使用3.损失函数在模型中的实现二、反向传播一、损失函数的介绍 参考&#xff1a; 损失函数&#xff08;loss function&#xff09; pytorch loss-functions 文档 作用&…

【JavaEE】基于TCP的客户端服务器程序

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:基于TCP的客户端服务器程序。 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵作者…

【JavaEE初阶】第二节.进程篇

文章目录 前言 一、操作系统 二、进程 2.1 进程的概念 2.2 进程的管理​​​​​​​​​​​​​​ 2.3 PCB 2.3.1 PCB里面的一些属性 2.3.2 进程的调度 2.3.3 进程的虚拟地址空间 2.3.4 进程间通信 总结 前言 本节内容我们继续对JavaEE的有关内容进行学习&#xff0c;…

汽车智能化,集度做加法

CES2023刚刚落下帷幕&#xff0c;这场名为“国际消费电子展”的业界盛会&#xff0c;近几年重心正明显转向智能汽车及其周边产业链。在2022年的CES上&#xff0c;集度与英伟达宣布合作&#xff0c;也透露了智能汽车研发的相关计划。而在本届CES之前、2022年末的广州车展上&…

一个关于image访问图片跨域的问题

一、背景 项目中遇到一个问题&#xff0c;同一个图片在 dom 节点中使用了 img 标签来加载&#xff0c;同时由于项目使用了 ThreeJS 3D 渲染引擎&#xff0c;在加载纹理时使用了 TextureLoader 来加载了同一张图片&#xff0c;而由于图片是在阿里云服务器上的&#xff0c;所以最…

SourceTree 拉取、重置提交、回滚、变基与合并

SourceTree的重置当前分支到此次提交 使用场景&#xff1a;“我想把已提交未推送的修改撤销” 使用模式说明软合并软合并是指将此次提交回滚到指定提交位置&#xff0c;但这个过程中会将修改过的文件暂存到暂存区。混合合并混合合并是指将此次提交回滚到指定的位置&#xff0c…

本来挺喜欢刷《剑指offer》的.......(第十一天)

跟着博主一起刷题 这里使用的是题库&#xff1a; https://leetcode.cn/problem-list/xb9nqhhg/?page1 目录剑指 Offer 66. 构建乘积数组剑指 Offer 68 - I. 二叉搜索树的最近公共祖先剑指 Offer 68 - II. 二叉树的最近公共祖先剑指 Offer 66. 构建乘积数组 剑指 Offer 66. 构建…

使用react-bmapgl绘制区域并判断是否重叠

需求如下&#xff1a; 在react项目中使用百度地图实现区域&#xff08;电子围栏&#xff09;的绘制绘制的区域类型为&#xff1a;1、多边形 2、圆形可绘制多个区域区域不能有重叠可重新编辑区域 代码如下: index.tsx import { useCallback, useEffect, useState } from rea…

Python入门实践(二)——变量的使用

文章目录变量1、变量的命名和使用1.1、避免命名错误2、字符串2.1、修改字符串大小写2.2、合并&#xff08;拼接&#xff09;字符串2.3、使用制表符或换行符来添加空白2.4、删除空白3、数字3.1、整数3.2、浮点数3.3、使用str()避免类型错误4、注释变量是对一种数据结构的命名&am…

2023年基建工程(设计规划施工)经验分享,超多干货

为了彻底打通从工程外业勘探调查、数据资料整理&#xff0c;到内业详细设计之间的一系列障碍&#xff0c;结合工程外业调查的特点&#xff0c;基于安卓&#xff08;Android&#xff09;操作系统&#xff0c;精心打磨推出了“外业精灵”移动端应用软件。 该系统把工程外业探勘、…

MPP数据库简介及架构分析

目录什么是MPP&#xff1f;特性并行处理超大规模数据仓库真正适合什么典型的分析工作量数据集中化线性可伸缩性MPP架构技术特性数据库架构分析Shared EverythingShared DiskShare MemoryShared NothingShared Nothing数据库架构优势什么是MPP&#xff1f; MPP (Massively Paral…