一,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实现图片优化上传的更多相关文章

  1. 在浏览器端用H5实现图片压缩上传

    一.需求的场景: 在我们的需求中需要有一个在手机浏览器端,用户实现上传证件照片的功能,我们第一版上了一个最简版,直接让用户在本地选择图片,然后上传到公司公共的服务器上. 功能实现后我们发现一个问题,公 ...

  2. 基于H5+ API手机相册图片压缩上传

    // 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照 ...

  3. 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)

    涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...

  4. base64格式的图片如何上传到oss

    ---恢复内容开始--- 对于base64图片的上传这个东西,一直是一个问题尤其是上传到oss.我们这次开发由于需要修剪图片,使用了h5的很多新特性. h5修剪图片,使用了我们的canvas.这个步骤 ...

  5. Html5+asp.net mvc 图片压缩上传

    在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法 ...

  6. H5危险的文件上传对话框

    文件对话框 文件上传对话框是一直以来就存在的网页控件. 到了 HTML5 时代,增加了更多的功能,例如支持文件多选.Chrome 甚至还支持「上传文件夹」这一私有特征: <input type= ...

  7. 深入研究HTML5实现图片压缩上传

    上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起.虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢 ...

  8. android中的文件(图片)上传

    android中的文件(图片)上传其实没什么复杂的,主要是对 multipart/form-data 协议要有所了解. 关于 multipart/form-data 协议,在 RFC文档中有详细的描述 ...

  9. 基于vue + axios + lrz.js 微信端图片压缩上传

    业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能 ...

随机推荐

  1. python高级编程之选择好名称:完2

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #分解代码 #小就是美,这也适用所有级别的代码,当一个函数,类或者一 ...

  2. IOS 用drawRect 画表格

    自定义一个View DrawLine DrawLine.h #import <UIKit/UIKit.h> @protocol gridTouchDelete <NSObject&g ...

  3. blockUI

    组件主页 主要使用到 blockUI 组件实现 将jquery和组件的JS下载到本地 然后直接就可以实现遮罩层功能 显示遮罩层:$.blockUI(); 隐藏遮罩层:$.unblockUI(); 该网 ...

  4. samba服务器概述

    一.samba服务器概述 Samba是一个能让Linux系统应用Microsoft网络通信协议的软件.而SMB是Server Message Block的缩写,即为服务器消息块.SMB主要作为Micr ...

  5. ubuntu apache2配置详解(含虚拟主机配置方法)

    ubuntu apache2配置详解(含虚拟主机配置方法) 在Windows下,Apache的配置文件通常只有一个,就是httpd.conf.但我在Ubuntu Linux上用apt-get inst ...

  6. 调起qq临时通话

    1.在qq推广的网站上的推广工具中将个人或者公司的qq确认为推广qq 2. 选择好显示的图片,将代码拷贝到页面上就可以了

  7. 关于bxslider在点击左右按钮之后不能自动切换的问题解决

    bxslider很好,但是也弄了个很脑残的设置,每次点击左右按钮之后,就不能自动切换了,要重新点击下方播放的按钮,相当不好用.问度娘没能解决,但是发现一个论坛说要修改源码,这个也找了好久,没找到,问群 ...

  8. EasyuiCombobox三级联动

    有许多刚接触Easyui中Combobox控件的朋友可能都会遇到的问题:如何将Combobox做成三级联动? 先本人有个三级联动的案例给大家参考参考,经测试能通过.注意Combobox绑定的数据是Js ...

  9. (a*b)%c 问题

    给你两个数__int64 类型的整数 a ,b,c.问你,(a*b)%c的值是多少??我们知道: (a*b)%c = ((a%c)*(b%c))%c .不过即使这样做,在c很大的情况下,(a%c)*( ...

  10. Js中单引号和双引号的区别

    <html> <body> <input value="外双引号内双引号-错误" type="button" onclick=&q ...