canvas压缩图片上传

UniApp H5图片上传:从选择到上传的完整链路拆解(含Canvas压缩组件源码) 本文深入解析UniApp H5图片上传全流程,涵盖从基础API调用到Canvas高级压缩技术的完整解决方案。针对H5环境特有的兼容性问题,提供详细的性能优化实践和源码实现,帮助开发者高效处理图片上传、压缩等核心功能,特别适用于拍照上传等移动端场景。 阅读详情

图片预览

使用html5中FileReader读取文件base64信息

var input = document.querySelector('input');
var preview = document.querySelector('.preview');

input.onchange = function(){
    var file = input.files[0];
    //创建一个文件读取者
    var reader = new FileReader();
    //读取文件base64信息
    reader.readAsDataURL(file);
    //读取成功
    reader.onload = function(e){
        var img = new Image();
        img.src = e.target.result;
        preview.appendChild(img)
  }
}

效果图

原生XMLHttpRequest上传文件

html代码

<input type="file">
<button disabled="disabled">确认上传</button>
<div class="preview"><img src="" alt=""></div>
<div class="show"></div>
<script>
    var input = document.querySelector('input');//文件表单元素
    var btn = document.querySelector('button');//上传按钮
    var preview = document.querySelector('.preview > img');//图片预览区
    var show = document.querySelector('.show');//图片显示区

    input.onchange = function(){
        var file = this.files[0];
        //创建FileReader对象读取文件base64信息
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(e){
            preview.src = e.target.result;//预览图
        }
        btn.removeAttribute('disabled');//上传按钮可点击
        //点击上传
        btn.onclick = function(){
            var xhr = new XMLHttpRequest();
            //创建formData对象
            var formData = new FormData();
            //加入上传文件数据
            formData.append('file', file);
            xhr.open('post', '/upload', true);
            xhr.onreadystatechange = function(){
                //文件上传成功
                if(xhr.readyState === 4 && xhr.status === 200){
                    //后台返回数据,包含文件存储路径
                    var resObj = JSON.parse(xhr.responseText);
                    preview.src = '';//清除预览图
                    input.value = '';//清空input值
                    btn.setAttribute('disabled', 'disabled');//上传按钮不可点击
                    //图片显示区
                    var img = new Image();
                    img.src = resObj.filePath;
                    img.style.display = 'block';
                    show.appendChild(img);
                }
            }
            //上传文件
            xhr.send(formData);
        }
    }
        
</script>

koa2后台代码,使用koa-body中间件

const Router = require('koa-router');
const router = new Router();
const koaBody = require('koa-body');
const fs = require('fs');

router.use(koaBody({
    multipart: true,
    formidable: {
        maxFileSize: 200 * 1024 * 1024 // 设置上传文件大小最大限制,默认2M
    }
}));

router.post('/', async ctx => {
    try{
        let file = ctx.request.body.files.file; // 获取上传文件
        let reader = fs.createReadStream(file.path); // 创建可读流
        let ext = file.name.split('.').pop(); // 获取上传文件扩展名
        let filePath = `public/upload/${Date.now().toString()}.${ext}`;//存储路径
        let writer = fs.createWriteStream(filePath); // 创建可写流
        reader.pipe(writer); // 可读流通过管道写入可写流
        return ctx.body = {
            msg: '上传成功',
            filePath: filePath.slice(7)
        }
    }catch(error){
        return;
    }
})


module.exports = router;

用canvas将图片进行裁切再上传

思路是先判断原文件大小,然后用canvas裁切,然后canvas转成dataURL,再将dataURL转成blob对象,然后上传

dataURL转blob方法

//dataUrl转blob
function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

canvas裁切

//处理图片
function drawImg(file){
    return new Promise((resolve, reject) => {
        let reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(e){
            let imgSrc = e.target.result;
            let img = new Image();
            img.src = imgSrc;
            img.onload = function(){
                console.log(this.width, this.height);
                let originWidth = this.width;   //图片原宽度
                let originHeight = this.height;
                let targetWidth = originWidth;  //图片裁剪目标宽度
                let targetHeight = originHeight;
                let quality = 0.8;     //图片质量0-1之间(默认0.92)
                if(originWidth < 2000 && file.size >= 1*1024*1024){     //如果图片宽度小于2000px且大小大于1m
                    quality = 0.6;
                }else if(originWidth >= 2000){      //如果图片宽度大于2000px
                    targetWidth = Math.round(originWidth * 0.6);
                    targetHeight = Math.round(originHeight * 0.6);
                    quality = 0.6;
                }
                let canvas = document.createElement('canvas');
                let ctx = canvas.getContext('2d');
                //画板大小
                canvas.width = targetWidth;
                canvas.height = targetHeight;
                //清除画板
                ctx.clearRect(0, 0, targetWidth, targetHeight);
                //绘画
                ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
                //canvas转dataURL
                let dataUrl = canvas.toDataURL(file.type, quality);
                let blob = dataURLtoBlob(dataUrl);    //得到blob对象
                let formData = new FormData();
                formData.append('file', blob, file.name);
                resolve(formData);
            }
        }
    })
}

参考文章

参考文章

参考文章

参考文章

 

通过Canvas及File API缩放并上传图片完整示例 只上传了html,后台代码没有上传,如果需要请到我的博客查看《通过Canvas及File API缩放并上传图片完整示例》 立即下载

相关推荐

Nodejs实现图片上传、压缩预览、定时删除功能

前言 我们程序员日常都会用到图片压缩,面对这么常用的功能,肯定要尝试实现一番。 第一步,node基本配置 这里我们用到的是koa框架,它可是继express框架之后又一个更富有表现力、更健壮的web框架。 1、引入基本配置 const Koa = require('koa');// koa框架 const Router = require('koa-router');// 接口必备 const cors = require('koa2-cors'); // 跨域必备 const tinify = require('tinify'); // 图片压缩 const serve = require

前端js实现canvas压缩图片并上传

可以减少用户的等待时间,提升使用体验,目前手机拍摄的图片文件大小一般在几 M 左右,文件直接上传时会有卡顿现象

铁锤妹妹的博客 6095

JS图片压缩上传 canvas 压缩图片

1.运用 canvas 实现 图片上传压缩 2.包含 将图片转为Base64位 以及转为Blob对象

利用canvas压缩图片并上传

最近项目太太太紧张,一个月才憋出了这篇自认为有点干货的文章,先拿出来晒一晒,本文所有代码地址都可以到github下载。 接下来 直奔主题: 背景:去年开发一个IM即时聊天系统,需要发送图片的功能。那么图片肯定不能太大,但是目前手机端随便拍个照片都得个5M以上了,直接传上去的话那就太耗费线上资源了。怎么能把图片占用空间变小并且又能不太失真呢,那就用canvas试试! 思路: 1、从设备选择图片 2、读取文件 。2.1、转换file文件为base64 。2.2、获取文件拍摄方向信息 3、利用canvas

weixin_42159569的博客 2296

通达信缠论中枢自动识别与画线实战指南

本文详细介绍了通达信缠论中枢自动识别与画线公式的实战应用。该工具通过严谨的算法逻辑,自动在K线图上标记出符合缠论定义的中枢区间,帮助投资者摆脱繁琐的手工画图,聚焦于价格与中枢的互动关系,从而高效识别趋势延续、背驰及第三类买卖点,提升缠论分析与交易决策的效率。

weixin_29267307的博客 663

oh-my-zsh详细安装与主题插件配置

使用Linux的小伙伴都知道默认shell是bash,但是对于喜欢折腾,喜欢酷炫的我们bash怎能够用。zsh的作为一种shell,功能更强大,但是配置复杂。后来,有大佬创建了一个名为oh-my-zsh的开源项目,使用方便,功能强大。 下面就去oh-my-zsh的配置。 ①安装zsh 想要安装oh-my-zsh,首先得安装zsh,输入命令 sudo apt-get install zsh 界面如下 ②查看是否安装成功 输入命令 zsh --version 可以查看安装zsh的版本..

惜洛-Jankin的博客 2万+

前端FileReader预览、canvas压缩图片并上传

压缩图片预览并上传 思路 用户通过input框选择图片 使用FileReader进行图片预览 将图片绘制到canvas画布上 使用canvas画布的能力进行图片压缩 将压缩后的Base64(DataURL)格式的数据转换成Blob对象进行上传(待更新) 认识上传文件元素 input type=‘file’ 包含一个选择文件按钮和文字,file类型的input会有files属性,保存着文件的相关信息。 文件信息 由传入的file对象组成 <body> <input type=

CodePrincess的博客 1394

Android逆向分析

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。Android应用 Java编写的,利用Android SDK编译代码,并并且把所有的数据和资源文件打包成一个APK(Android Package)文件这是一个后缀名为.apk的压缩文件,apk文件中包含了一个Anddroid应用程序的所有内容,是Android平台用于安装应用程序的文件。

qq_51598534的博客 6294

上传前利用canvas图片压缩

【代码】上传前利用canvas图片压缩。

weixin_44957344的博客 229

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

vue3 - element-plus表格组件el-table实现鼠标拖曳排序功能,vue3 Table表格拖拽排序,表格每行使用鼠标拖动进行排序功能,表格拖拽排序实现(详细示例代码,一键复制开箱即用

vue3,elementPlus,el-table,typescript,表格组件,Table表格,表格拖动排序,表格拖曳排序,鼠标拖拽表格进行排序功能,elementplus表格如何实现拖动每行进行排序操作,表格拖动改变顺序,鼠标拖曳,表格内的数据项拖拽排序,vue3如何实现element-Plus表格组件进行表格内的数据项拖拽排序,列表拖拽排序效果,实现table动态拖拽,鼠标拖着排序,vue3 element Plus 表格拖曳拖动拖拽 排序,el-table拖拽排序实现,表格内容拖拽重新排序,树形表

✅ 精选推荐文章 1万+

Canvas实现图片压缩上传

接到产品需求,问能不能将前端上传的图片压缩?像移动端上传图片,一般都是超清、高清图片,大小也有10M,甚至一张图片大小有15M左右,这样大的图片上传到腾讯云或者阿里云(没使用服务器上传图片)一方面上传速度慢,影响体验,另一方面体积太大占空间,图片压缩避免了,网上搜到了很多这方面介绍的网址,大多数都是用canvas来实现(不说了,马上开干)!。 实现过程 (...

nostrud ipsum6 347

YOLOv13|损失函数优化篇:Focal EIOU 保持良好性能的同时,提供更高效的计算和更稳定的训练过程-包源码

Focal IoU与EIoU:目标检测中的损失函数优化 摘要:本文深入探讨了目标检测中两种重要的边界框回归损失函数优化方法。Focal IoU借鉴Focal Loss思想,通过(1-IoU)^γ因子调节损失权重,使模型更关注难样本(低IoU预测框),有效解决了传统IoU Loss对难易样本权重相同的问题。EIoU则在CIoU基础上改进,通过简化长宽比计算、分离宽高损失项,提升了计算效率和训练稳定性。两种方法分别从样本权重分配和损失函数结构优化角度,显著提升了目标检测性能,为实际应用提供了更高效的解决方案。文

FJN110的博客 1864

uni-app 图片上传组件 canvas压缩

前段时间刚入坑uni-app,就被分配到做图片上传的组件 地位卑微,只能肝,先看看效果图 单张图片上传 多张图片上传 点击图片的效果 上代码: <template> <view class="uploadImage" :class="styleClass"> <view class="list-box" :class="onePicClass" :style="{ minHeight: height + 'rpx'}"> <vi

weixin_39357177的博客 1885

手把手教你学Simulink--逆变器场景:基于Simulink的单相全桥逆变器PWM控制仿真建模

本文介绍了使用Simulink和Simscape Electrical库进行单相全桥逆变器PWM控制仿真建模的详细步骤。主要内容包括:从创建Simulink项目、添加电力电子组件、构建逆变器模型,到设置参数、运行仿真和结果分析。重点讲解了逆变器核心模块的配置、PWM信号生成、负载建模等关键环节,并提供了优化改进建议。该指南适用于电力电子初学者,通过仿真可以帮助理解单相全桥逆变器的工作原理和PWM控制技术,为实际应用和算法开发提供基础平台。

MHD0815的博客 666

华为OD机试 双机位C卷:微服务的集成测试 (C/C++/Py/Java/JS/Go)

华为OD机试 双机位C卷 :微服务的集成测试 ,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 微服务的集成测试 , 华为OD 微服务的集成测试

qq_45776114的博客 2066

谈谈图片上传及canvas压缩的流程

我们通常在做图片上传的时候都会遇上这样的情况,一是后端接口限制上传图片的大小,或者是即使后端没有限制大小,因为图片太大在前端渲染时太慢,造成页面加载体验较差。因此我们很有必要对上传的图片进行压缩。 本文在gitthub做了收录:github.com/Michael-lzg… 本文主要包括以下流程: 用户通过input框选择图片 使用FileReader进行图片预览 将图片绘制到canvas画布上 使用canvas画布的能力进行图片压缩 将压缩后的Base64(DataURL)...

Michael_lzg的博客 533

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

H5压缩图片上传(FileReader +canvas)

因为最近项目做一个webApp的页面,需要上传图片,总结了一下,思路如下: 一、监听一个input (type='file') 的 change 事件,然后拿到文件的 file; <input id="img-input" class="upload-input" type="file" accept="image/*" id="imgbox" multiple/>...

aek7426的博客 203

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

处理图片上传 并利用canvas压缩 且转化为base64,

vue上传图片,并压缩,转化base64

tutou_cute的博客 634

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ueditor使用canvas在图片上传前进行压缩

之前就看到H5使用canvas就可以在前端使用JS压缩图片,这次接到任务要把这个功能嵌入到ueditor里面去,以节省流量,减轻服务器压力。 H5使用canvas进行压缩的代码有很多,核心原理就是创建Image对象,导入canvas,限制canvas大小,然后导出为base64,生成二进制对象,最后将二进制对象进行上传。 我们要修改的文件在ueditor.all.js里,第24352行: U...

weixin_30535167的博客 295

压缩图片上传 —— canvas和ajax

1、 图片加载完毕,把图片绘制到canvas上去 2、转换为Bold对象或File对象 3、ajax上传,一定要加name // ajax上传图片——文件流方式 export function upload(base64, name) { return new Promise((resolve, reject) => { Toast.loading({ durat...

xiaoququ的博客 279

HTML5 fileReader对象实现图片上传(支持一次上传多张图片),并用canvas进行前端压缩

首先页面布局的代码是这样的 将type="file"的input绝对定位到上传图片的图标上,并且将opacity设置为0,即可实现样式效果。 multiple代表可支持一次上传多张图片 accept=“image/*” :代表会打开图库或者照相机 但是在Chrome和Safari等Webkit浏览器下却出现了响应滞慢的问题,可能要等 6~10s 才能弹出文件选择对话框,简直不能忍呀。 在IE和Firefox中则没有发现响应延迟的问题 解决办法:accept=“image/gif,image/jpeg,ima

Flowering_Vivian的博客 896

Vue中用canvas对图片上传前压缩

Vue中用canvas对图片上传前压缩

I大俊 1356

H5 canvas实现客户端压缩图片上传

现在手机随随便便拍个照都是5、6MB,如果用户提交图片,即占服务器资源,上传速度又慢,影响用户体验度,所以一般都会对图片进行处理。 之前用php写过一个压缩图片程序,是先将图片上传到服务器之后,在服务器端进行压缩,效果不是很理想。 后来想想,还是决定要在客户端压缩,依靠H5的canvas来对图片在本地进行压缩处理,将图片处理成为base64编码,然后发送到后台,后台再做处理然后存储就好了(这样...

zhenhuaYang 的个人博客 6170

h5 input type=file ios拍照相片旋转90度修正 前端图片利用canvas处理压缩 vue图片上传优化处理

直接进入正题 input type=file 是前端处理图片上传的必要途径 这里说一下 第一个需求 如果用户点击type=file的按钮 只想完成调用照相功能 而不用选取照片功能 其实 input type=file标签上还是有很多 特殊好玩的属性的 我们列举一下 <input type="file" accept="image/*" capture="camera"...

gaoqiang1112的博客 4410

前端 canvas压缩图片上传

学习随笔*HTML代码**JS代码* HTML代码 <input type="file" name="" id="upload"> JS代码 // 获取input元素 const upload = document.getElementById('upload') upload.addEventListener('change', (e) => changeCallback(e)) // 选择文件后执行的回调 func

weixin_45762331的博客 280
上一篇: 使用发布订阅模式简单实现类似vue的双向数据绑定
下一篇: koa2中一些常用中间件
samfung09
博客等级 码龄9年 15粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值