step1:读取选择的图片,并转为base64;

function  ImgToBase64 (e, fn) {
// 图片方向角
//fn为传入的方法函数,在图片操作完成之后执行
var Orientation = null;//ios选择上传图片是图片角度问题
var base64 = false;
var max_size = 480 * 1024;//单位B,图片最大尺寸
var ratio = 0.99;
if (window.File && window.FileList && window.FileReader && window.Blob) {
e = e || window.event;
e.stopPropagation(); // 阻止冒泡
e.preventDefault(); //阻止默认行为
var files = e.target.files;
var f = files[0];//图片单张上传
if (f) {
var rFilter = /^(image\/jpeg|image\/png)$/i; // 检查图片格式
if (!rFilter.test(f.type)) {
base64 = false;
$.m.fade("请选择jpeg、png格式的图片");
return;
}
//获取照片方向角属性ios
//ios图片方向调整需要加载exif exif文件下载
EXIF.getData(f, function () {
EXIF.getAllTags(this);
Orientation = EXIF.getTag(this, 'Orientation');
});
}
if (f.size < 10) {
base64 = false;
return;
} else if (f.size > 1024 * 1024 * 10) {
//10M
base64 = false;
$.m.fade("您选择的图片过大,请重新选择10M以内的图片!");
return;
}
$.m.loading(true); var reader = new FileReader();
var image = new Image;
image.src = '';
reader.onload = function () {
image.src = this.result;
image.onload = function () {
//生成canvas
var canvas = document.createElement("canvas");
var ctx = canvas.getContext('2d');
var w = image.naturalWidth,
h = image.naturalHeight;
canvas.width = w;
canvas.height = h;
ctx.drawImage(image, 0, 0);//, w, h, 0, 0, w, h
if (Orientation != "" && Orientation != 1 && Orientation != undefined) {
switch (Orientation) {
case 6://需要顺时针90度旋转
canvas.width = h;
canvas.height = w;
ctx.rotate(90 * Math.PI / 180);
ctx.drawImage(this, 0, -h);
break;
case 8://需要逆时针90度旋转
canvas.width = h;
canvas.height = w;
ctx.rotate(-90 * Math.PI / 180);
ctx.drawImage(this, -w, 0);
break;
case 3://需要180度旋转
ctx.rotate(180 * Math.PI / 180);
ctx.drawImage(this, -w, -h);
break;
}
}
compressImg(ratio);//压缩图片
function compressImg(_ratio) {
base64 = canvas.toDataURL("image/jpeg", _ratio);
var _f = base64ToBlob(base64, new Date().getTime());
//没有达到要求的图片尺寸时,反复压缩
if(_ratio>0.11 && _f.size > max_size){
var rr =parseFloat((_ratio - 0.11).toFixed(2)) ;
compressImg(rr);
}else if(_ratio<=0.11 && _ratio>0 && _f.size > max_size){
var rr =parseFloat((_ratio - 0.01).toFixed(2)) ;
compressImg(rr);
}else{
fn(base64);
}
}
};
}
reader.readAsDataURL(f);
}
}

step2:将图片转成上传需要的文件格式(blob);

function base64ToBlob (_data, timeTrap) {
//window.atob方法将其中的base64格式的图片转换成二进制字符串;若将转换后的值直接赋值给Blob会报错,需Uint8Array转换:最后创建Blob对象;
//base64转blob
_data = _data.split(',')[1];
var binary = window.atob(_data);
var len = binary.length;
var buffer = new ArrayBuffer(len);
var view = new Uint8Array(buffer);
for (var i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
var blob = new Blob([view], { type: 'image/jpeg' });
blob.name = timeTrap + '.jpg';//以时间戳给图片重命名
return blob;
}

step3:调用以上方法,小栗子:

页面布局:

 <div class="l-m-r">
<span class="mtitle">选择图片</span>
<span class="m"></span>
<span class="right-text">
<div class="p-imgs">
<div class="top-bottom" id="img-upload">
<i class="iconfont yxticon-camera"></i>
<p>添加商品图</p>
<input class="file" image-file type="file" accept="image/*,camera">
                        </div>
</div>
</span>
</div>

元素属性绑定事件:

'image-file': {
evt: 'change',
fun: function (e) {
//选择了图片
var _this = this;
//input的file框onchange事件触发一次失效的新的解决方法
$(this).remove();
$('#img-upload').append('<input class="file" image-file type="file" accept="image/*">')
ImgToBase64(e, setHtmlFun);//调用step1
function setHtmlFun(base64) {
$.m.loading(false);
if (params.file.length > 3) {
$.m.fade('图片最多只能上传4张!');
return;
}
var timeflag = new Date().getTime();
var blob =base64ToBlob(base64, timeflag);//调用step2
params.file[params.file.length] = blob;//将文件存储到对应参数中

//图片展示
var ele = '\
<div class="img">\
<img src="'+ base64 + '">\
<i class="iconfont yxticon-arrow-delete" delete-img data-name="'+ timeflag + '.jpg" ></i>\
</div>\
'
$('#uploadImgs').append(ele);
}
}
}

js 前端图片压缩+ios图片角度旋转的更多相关文章

  1. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  2. 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

    前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...

  3. Android 简单介绍图片压缩和图片内存缓存

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...

  4. js前端实现多图图片上传预览

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  5. Java实现图片压缩代码,图片大小转换

    在很多项目中我们会把上传的图片做处理,比较图片上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的高清图片,我们可以通过代码来做压缩.在我的项目中我们压缩图片的目的是让web页面打开的速度很快,并 ...

  6. UIImage 和 iOS 图片压缩UIImage / UIImageVIew

    UIImageView 制作气泡 stretchableImageWithLeftCapWidth http://blog.csdn.net/justinjing0612/article/detail ...

  7. iOS,图片处理

    1.旋转图片 2.缩放图片 3.截取图片指定区域 4.祛除图片白色背景,弄成透明png 5.将UIView转化为UIImage,并转化为data和base64 6.将视频一帧(CMSampleBuff ...

  8. Java后端实现图片压缩技术

    今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...

  9. Android webview实现上传图片的效果(图片压缩)

    mainactivity代码 package com.bwie.webviewupload; import java.io.ByteArrayInputStream; import java.io.B ...

随机推荐

  1. 立即掌握SSM框架的要诀

    ssm框架的总结: 1. 首先是POM.xml 文件的配置,他的作用主要是添加依懒的关系和自动下载相关的包. 2.对jdbc.properties进行配置 ,作用就是连接你的数据库的配置. 3.对接着 ...

  2. 织梦dedecsm系统"企业简介"类单栏目模版如何修改和调用

    2013-1-12 14:46 | 发布者: moke | 栏目:dedecms教程        我们的模版里应该都有article_article.htm这个模版,这个模版是文章内容页模板,也就是 ...

  3. IOS开发之UIView总结1

    太长了,请看 http://blog.csdn.net/xdrt81y/article/details/9128695 performSelector: performSelector:withObj ...

  4. Visio绘制用例图问题集锦

    1.Visio画UML用例图没有include关系的解决方法 发现Visio UML用例里面找不到include关系,即"箭头"+"<<include> ...

  5. hive(II)--sql考查的高频问题

    在了解别人hive能力水平的时候,不管是别人问我还是我了解别人,有一些都是必然会问的东西.问的问题也大都大同小异.这里总结一下我遇到的那些hive方面面试可能涉及的问题 1.行转列(列转行) 当我们建 ...

  6. redux学习日志:关于react-redux

    首先先强调一句:一定要多读官方文档,而且要精读,否则你会忽略掉很多东西! 一,Provider 刚开始看的时候,大致浏览了一下,知道了这个组件是能够接收store作为它的属性,然后它里面的子组件就可以 ...

  7. eclipes快捷键

    本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D ...

  8. ASP.net core 2.0.0 中 asp.net identity 2.0.0 的基本使用(四)—用户注册

    修改用户注册 1.修改用户名注册规则. 打开Controllers目录下的AccountController.cs. 在控制器中找到 public async Task<IActionResul ...

  9. 基于jQuery表单快速录入数据功能

    一.功能介绍:完全依靠jQuery,表单table新增行(按键盘tab增一行,按esc删一行),也可以加一个新增行按钮点击新增多行,这里就不多说了~~ 二.该功能主要实现技术: 1,总体.NET MV ...

  10. JS与ajax遍历list

    示例: <script> <c:forEach var="yanan" items="${yananList}">            ...