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. Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    利用ssh传输文件   在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www ...

  2. O2O网站

    编辑 020是新型的网络营销模式,O2O即Online To Offline,线下销售与服务通过线上推广来揽客,消费者可以通过线上来筛选需求,在线预订.结算,甚至可以灵活地进行线上预订,线下交易.消费 ...

  3. Tomcat 源码分析(二)——Request处理全过程

    前一篇博客,我总结了Tomcat对于生命周期组件的管理.在了解了容器的启动之后,我们开始剖析它的内部运行机制.今天我们来分析一下Tomcat如何处理Request.Socket作为网络通信的基础也是R ...

  4. Aliase_小白学Python_Day0_前言

    听到有老师介绍,说你为什么不把你的学习过程保存下来,一是当做总结,二是作为分享.我想,也对.这算是我的第一个博客,本次想写写我为什么选择学习Python. 很多人都问过我一个问题,行业那么多,你为什么 ...

  5. web组件开发入门

    本文是学习慕课网阿当大话西游之WEB组件后的一个总结. 组件的分类 1 框架组件:依赖于某种框架的组件 2 定制组件:根据公司业务定制的组件 3 独立组件:不依赖框架的组件 定义和加载组件 解决css ...

  6. asp.net -mvc框架复习(9)-实现用户登录控制器和视图的编写并调试

    1.编写控制器 三个步骤: [1]获取数据 [2]业务处理 [3]返回数据 using System;using System.Collections.Generic;using System.Lin ...

  7. 一天浓缩学习webpack经过

    熟话说浓缩就是精华,哈哈,所以就这么简单粗暴的介绍下吧,写下的都是精华. 已经不是第一次听说webpack,但是我的起步有点晚,现在才看.开门见山~~ 1.什么是webpack? webpack是当下 ...

  8. php中session_start()函数的作用

    php中session_start()函数的作用 用$_SESION之前必须要session_start()----其中之一的功能,$_SESSION是服务器端的cookie,相当一个大数组(浏览器关 ...

  9. linux mysql下忘记root密码解决办法

    1 修改MySQL的登录设置 # vi /etc/my.cnf 在[mysqld]的中加上一句:skip-grant-tables  2 重新启动mysqld # /etc/init.d/mysqld ...

  10. java日志概述和原理

    OK,现在我们来研究下Java相关的日志. 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源.对于开发人员来说,在程序中使 ...