H5实现图片优化上传
一,HTML部分
<input type="file" accept="images/*">
<input class="url" type="url" placeholder="url">
<div class="container"></div>
<button class="submit">Submit</button>
二,CSS部分
.container{
width: 300px;
}
.resizer{
overflow: hidden;
}
.resizer.have-img button.ok{
display: inline-block;
}
.resizer.have-img .inner {
display: block;
}
.inner{
width: 100%;
position: relative;
font-size: 0;
overflow: hidden;
display: none;
}
img{
width: 100%;
}
.frames{
position: absolute;
top: 0;
left: 0;
border: 1px solid black;
cursor: move;
outline: rgba(0, 0, 0, 0.6) solid 10000px;
}
button.ok{
float:right;
margin-left: 5px;
display: none;
}
canvas{
max-width: 100%;
margin:auto;
display: block;
}
三,JS部分(重点)
var tmp=$('<div class="resizer">'+
'<div class="inner">'+
'<img>'+
'<div class="frames"></div>'+
'</div>'+
//'<button>✗</button>'+
'<button class="ok">✓</button>'+
'</div>');
$.imageResizer=function(){
if(Uint8Array&&HTMLCanvasElement&&atob&&Blob){
}else{
return false;
}
var resizer=tmp.clone();
resizer.image=resizer.find('img')[0];
resizer.frames=resizer.find('.frames');
resizer.okButton=resizer.find('button.ok');
resizer.frames.offset={
top:0,
left:0
};
resizer.okButton.click(function(){
resizer.clipImage();
});
resizer.clipImage=function(){
var nh=this.image.naturalHeight,
nw=this.image.naturalWidth,
size=nw>nh?nh:nw;
size=size>1000?1000:size;
var canvas=$('<canvas width="'+size+'" height="'+size+'"></canvas>')[0],
ctx=canvas.getContext('2d'),
scale=nw/this.offset.width,
x=this.frames.offset.left*scale,
y=this.frames.offset.top*scale,
w=this.frames.offset.size*scale,
h=this.frames.offset.size*scale;
ctx.drawImage(this.image,x,y,w,h,0,0,size,size);
var src=canvas.toDataURL();
this.canvas=canvas;
this.append(canvas);
this.addClass('uploading');
this.removeClass('have-img');
src=src.split(',')[1];
if(!src)return this.doneCallback(null);
src=window.atob(src);
var ia = new Uint8Array(src.length);
for (var i = 0; i < src.length; i++) {
ia[i] = src.charCodeAt(i);
};
this.doneCallback(new Blob([ia], {type:"image/png"}));
};
resizer.resize=function(file,done){
this.reset();
this.doneCallback=done;
this.setFrameSize(0);
this.frames.css({
top:0,
left:0
});
var reader=new FileReader();
reader.onload=function(){
resizer.image.src=reader.result;
reader=null;
resizer.addClass('have-img');
resizer.setFrames();
};
reader.readAsDataURL(file);
};
resizer.reset=function(){
this.image.src='';
this.removeClass('have-img');
this.removeClass('uploading');
this.find('canvas').detach();
};
resizer.setFrameSize=function(size){
this.frames.offset.size=size;
return this.frames.css({
width:size+'px',
height:size+'px'
});
};
resizer.getDefaultSize=function(){
var width=this.find(".inner").width(),
height=this.find(".inner").height();
this.offset={
width:width,
height:height
};
console.log(this.offset)
return width>height?height:width;
};
resizer.moveFrames=function(offset){
var x=offset.x,
y=offset.y,
top=this.frames.offset.top,
left=this.frames.offset.left,
size=this.frames.offset.size,
width=this.offset.width,
height=this.offset.height;
if(x+size+left>width){
x=width-size;
}else{
x=x+left;
};
if(y+size+top>height){
y=height-size;
}else{
y=y+top;
};
x=x<0?0:x;
y=y<0?0:y;
this.frames.css({
top:y+'px',
left:x+'px'
});
this.frames.offset.top=y;
this.frames.offset.left=x;
};
(function(){
var time;
function setFrames(){
var size=resizer.getDefaultSize();
resizer.setFrameSize(size);
};
window.onresize=function(){
clearTimeout(time)
time=setTimeout(function(){
setFrames();
},1000);
};
resizer.setFrames=setFrames;
})();
(function(){
var lastPoint=null;
function getOffset(event){
event=event.originalEvent;
var x,y;
if(event.touches){
var touch=event.touches[0];
x=touch.clientX;
y=touch.clientY;
}else{
x=event.clientX;
y=event.clientY;
}
if(!lastPoint){
lastPoint={
x:x,
y:y
};
};
var offset={
x:x-lastPoint.x,
y:y-lastPoint.y
}
lastPoint={
x:x,
y:y
};
return offset;
};
resizer.frames.on('touchstart mousedown',function(event){
getOffset(event);
});
resizer.frames.on('touchmove mousemove',function(event){
if(!lastPoint)return;
var offset=getOffset(event);
resizer.moveFrames(offset);
});
resizer.frames.on('touchend mouseup',function(event){
lastPoint=null;
});
})();
return resizer;
};
var resizer=$.imageResizer(),
resizedImage;
if(!resizer){
resizer=$("<p>Your browser doesn't support these feature:</p><ul><li>canvas</li><li>Blob</li><li>Uint8Array</li><li>FormData</li><li>atob</li></ul>")
};
$('.container').append(resizer);
$('input').change(function(event){
var file=this.files[0];
resizer.resize(file,function(file){
resizedImage=file;
});
});
$('button.submit').click(function(){
var url=$('input.url').val();
if(!url||!resizedFile)return;
var fd=new FormData();
fd.append('file',resizedFile);
$.ajax({
type:'POST',
url:url,
data:fd
});
});
H5实现图片优化上传的更多相关文章
- 在浏览器端用H5实现图片压缩上传
一.需求的场景: 在我们的需求中需要有一个在手机浏览器端,用户实现上传证件照片的功能,我们第一版上了一个最简版,直接让用户在本地选择图片,然后上传到公司公共的服务器上. 功能实现后我们发现一个问题,公 ...
- 基于H5+ API手机相册图片压缩上传
// 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照 ...
- 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...
- base64格式的图片如何上传到oss
---恢复内容开始--- 对于base64图片的上传这个东西,一直是一个问题尤其是上传到oss.我们这次开发由于需要修剪图片,使用了h5的很多新特性. h5修剪图片,使用了我们的canvas.这个步骤 ...
- Html5+asp.net mvc 图片压缩上传
在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法 ...
- H5危险的文件上传对话框
文件对话框 文件上传对话框是一直以来就存在的网页控件. 到了 HTML5 时代,增加了更多的功能,例如支持文件多选.Chrome 甚至还支持「上传文件夹」这一私有特征: <input type= ...
- 深入研究HTML5实现图片压缩上传
上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢 ...
- android中的文件(图片)上传
android中的文件(图片)上传其实没什么复杂的,主要是对 multipart/form-data 协议要有所了解. 关于 multipart/form-data 协议,在 RFC文档中有详细的描述 ...
- 基于vue + axios + lrz.js 微信端图片压缩上传
业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能 ...
随机推荐
- Linux 挂载命令 --mount
1.挂载光盘命令 mount : mount [-t vfstype] [-o options] device dir mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点 -t ...
- NET基础课--泛型(NET之美)
1.泛型,类型或方法的一种抽象概括. 2.泛型类:在类型名后面加一个<>,其中传递占位符,也就是类型参数.where是类型约束 可以再查资料 public class SortHelper ...
- Android系统,动态找出一个包下所有的类
最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...
- iOS 之URL schemes
添加 URL schemes 步骤: 1.打开info.plist文件. 2.点击 “+ ”号添加,或者在列表上点击鼠标右键,选择 Add Row. 3.选择 URL types. 4.点击三角号展 ...
- hdu 1085 Holding Bin-Laden Captive!
Problem Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for ...
- shell中的expr命令
expr 可以进行的操作如下: 逻辑操作 arg1 | arg2 逻辑或操作,真则返回arg1,否则返回arg2(以null或者0来判断参数的真假,有短路功能) arg1 & arg2 逻辑与 ...
- 学了一个封装的jquery插件,感觉还成
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MAC下用OPENSSL生成公钥和私钥
MAC OS自带了OpenSSL,所以不用去编译那一坨跟SHIT一样的源码.直接在命令行里使用OPENSSL就可以. 打开命令行工具,然后输入 openssl打开openssl,接着只要三句命令就可以 ...
- [C++程序设计]对“&”和“*”运算符
对“&”和“*”运算符再做些说明:(1) 如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?“&”和“*”两个运算符的优先级别相同 ...
- WordPress插件制作教程概述
接下来的一段时间里,开始为大家讲解WordPress插件制作系列教程,这篇主要是对WordPress插件的一些介绍和说明,还有一些我们需要注意的地方,以及需要掌握的知识. WordPress插件允许你 ...