html5在线裁剪,HTML5 本地裁剪图片并上传至服务器(老梗)
很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的。但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 5 步。步骤繁琐不说,当很多用户上传图片的时候也很影响服务器性能。
HTML5 的出现让我们可以更方便的实现这一需求。虽然这里所说的技术都貌似有点过时了(前端界的“过时”,你懂的),但还是有些许参考价值。在这里我只说一下要点,具体实现同学们慢慢研究。
下面奉上我自己写的一个demo,在输入框中选好自己服务器 url, 生成好图片后点击 Submit 上传,然后自己去服务器里看看效果吧~~
浏览器要求支持以下 Feature:
代码直接从现有项目移植过来,没有经过“太多的”测试,写的很乱,也没注释,大家就慢慢看吧。。。重点就在 js 脚本的 28 行,clipImage 函数中,同学们可以直接跳过去看。
第一步:获取文件
HTML5 支持从 input[type=file] 元素中直接获取文件信息,也可以读取文件内容。我们用下面代码就可以实现:
javascript$('input[type=file]').change(function(){
var file=this.files[0];
// continue ...
});
第二部:读取文件,并生成 Image 元素
这一步就需要用到 FileReader 了,这个类是专门用来读取本地文件的。纯文本或者二进制都可以读取,但是本地文件必须是经过用户允许才能读取,也就是说用户要在input[type=file]中选择了这个文件,你才能读取到它。
通过 FileReader 我们可以将图片文件转化成 DataURL,就是以 data:image/png;base64, 开头的一种URL,然后可以直接放在 image.src 里,这样本地图片就显示出来了。
javascript$('input[type=file]').change(function(){
var file=this.files[0];
var reader=new FileReader();
reader.οnlοad=function(){
// 通过 reader.result 来访问生成的 DataURL
var url=reader.result;
setImageURL(url);
};
reader.readAsDataURL(file);
});
var image=new Image();
function setImageURL(url){
image.src=url;
}
Image 就是在 html 里的 标签,所以可以直接插入到文档流里。
第三步:获取裁剪坐标
这一步没啥好说的,实现的方法也很多,需要获得下面四个裁剪框的坐标:
Y坐标
X坐标
高度
宽度
如下图所示:
第四部:裁剪图片
这是时候我们就需要用到 canvas 了,canvas 和图片一样,所以新建 canvas 时就要确定其高宽。这里我们还运用到 image.naturalHeight 和 image.naturalWidth 这两个属性来获取图片原始尺寸。
将图片放置入 canvas 时需要调用 drawImage ,这个接口参数比较多,在 MDN 上有详细的说明。
javascriptdrawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
因为我们用 canvas 只是用于裁剪图片的,所以需要新建一个 canvas 让它的尺寸和裁剪之后图片的尺寸相等,此时 canvas 就相当与我们的裁剪框。运用这个函数还可以将大图缩放成小图,同学们自己研究吧。
javascript// 以下四个参数由第三步获得
var x,
y,
width,
height;
var canvas=$('')[0],
ctx=canvas.getContext('2d');
ctx.drawImage(image,x,y,width,height,0,0,width,height);
$(document.body).append(canvas);
将 canvas 加入文档流之后,就可以看到裁剪后的效果了。不过我们还需要将图片上传至服务器里。
第五步:读取裁剪后的图片并上传
这时我们要获取 canvas 中图片的信息,用 toDataURL 就可以转换成上面用到的 DataURL 。 然后取出其中 base64 信息,再用 window.atob 转换成由二进制字符串。但 window.atob 转换后的结果仍然是字符串,直接给 Blob 还是会出错。所以又要用 Uint8Array 转换一下。总之这里挺麻烦的。。
javascriptvar data=canvas.toDataURL();
// dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了
data=data.split(',')[1];
data=window.atob(data);
var ia = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) {
ia[i] = data.charCodeAt(i);
};
// canvas.toDataURL 返回的默认格式就是 image/png
var blob=new Blob([ia], {type:"image/png"});
这时候裁剪后的文件就储存在 blob 里了,我们可以把它当作是普通文件一样,加入到 FormData 里,并上传至服务器了。
FormData 顾名思义,就是用来创建表单数据的,用 append 以键值的形式将数据加入进去即可。但他最大的特点就是可以手工添加文件或者 Blob 类型的数据,Blob 数据也会被当作文件来处理。原生 js 可以直接传递给 xhr.send(fd), jquery 可以放入 data 里请求。
javascriptvar fd=new FormData();
fd.append('file',blob);
$.ajax({
url:"your.server.com",
type:"POST",
data:fd,
success:function(){}
});
然后你服务器里应该就可以收到这个文件了~
html5在线裁剪,HTML5 本地裁剪图片并上传至服务器(老梗)相关推荐
- 【VUE】Toast-UI/Editor工具实现图片自定义上传到服务器
Toast-UI/Editor工具实现图片自定义上传到服务器 author: jwensh date: 2021.06.17 文章目录 Toast-UI/Editor工具实现图片自定义上传到服务器 所 ...
- html5图片区域剪切,HTML5 本地裁剪图片并上传至服务器(老梗)
很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...
- cocos creator 调用相机相册裁剪图片并上传到服务器
大致思路就是creator里面js调用Java和object-c代码,调起系统相机相册,选取图库图片/拍照图片进行裁剪,然后转化为base64字符串,最后通过http post请求上传到服务器. Ja ...
- 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
最后更新17.01.20 一.首先这是HTML的代码 将要显示一张图片 二.然后这是JavaScript代码 var img_my = document.getElementById('my_img_ ...
- MUI+HTML5+Plus 拍照或者相册选择图片并上传服务器
引入文件 css:mui.min.css.app.css.iconfont.css.feedback-page.css.font-awesome.min.css js:jquery.js.common ...
- 树莓派上传文件到服务器,05_树莓派图片定时上传到服务器
1.准备图片存储服务器 1.获取服务器 选择七牛网作为服务器,因为它是一个免费的云图库 先要进行注册,之后,如图操作: 获取秘钥: 查询七牛的python调用API可知 # -*- coding: u ...
- uni-app开发微信小程序(获取多张本地相册图片并上传到服务器功能)
思路: 用户触发某一事件弹出一个弹窗(用户可能直接手机拍摄或者直接从手机相册选择照片),用户选择完方式后,调用对应的api并把选择好的照片上传到服务器. 涉及到的API: 1.uni.showActi ...
- 本地ecshop网站怎么上传到服务器,ecshop 上传服务器
ecshop 上传服务器 内容精选 换一换 将SAP应用服务器迁移到华为云,有以下两种方法:用方法一:主机迁移服务SMS进行迁移用方法二:镜像导入的方式进行迁移.我推荐使用方法一进行迁移,但是对于源端 ...
- unity从本地选择图片并上传
unity实现打开文件夹选择图片的两种方式: 一.引用System.Windows.Forms 此方法需要在unity的安装目录中找到System.Windows.Forms.dll文件并放在项目的P ...
最新文章
- 通过命令行在Python中测试以太坊RPC客户端
- 问题1:程序员要做一辈子?
- 定位(positioning)
- android 盒子 airplay,iOS Airplay--Airtunes音乐播放在Android盒子和手机上的实现 (第一篇)...
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑤ ( 执行 init-android-libyuv.sh | 执行 init-android-soundtouch.sh )
- qt中关于坐标的说明
- php服务层设计与实现的,PHP中service层怎么设计兼顾优雅和方便?
- JS判断是否在微信浏览器打开
- 80年代的我们对儿时零食的回忆
- linux命令行如何打开浏览器,Linux下的命令行浏览器links
- 为博聆网用户编写的userscript
- 树莓派4B 编译安装rtl8192eu usb网卡驱动
- 在网页中在线查看文档(doc、docx 、xls 、xlsx、 pdf 、swf )
- Flutter开始支持Windows了
- DS_Store是什么?
- 程序员英语 - Word Group
- IDEA的一些炫酷的插件
- 脑电EEG常用的特征
- 12306余票查询(五)——网页模板制作
- 直播翻车的罗永浩,和多次哽咽的罗玉龙是什么关系?
热门文章
- pytorch基础---李博文记录索引
- win10进入BIOS界面的方法
- 朗道-西格尔零点猜想(the Landau-Siegel Zeros Conjecture)
- 对计算机系美好期望,计算机系举行新生入学教育大会——学生讲堂
- 大直径硅晶圆在单晶炉高温高速热处理过程中的热行为
- C/C++去除行末空格
- 塞规公差带图_塞规和卡规公差表
- Android的资源引用(2)(Drawable)
- 机器学习第三课--LWR的疑惑与想法
- linux中的 bin sh,Linux-#!/bin/sh理解