js 前端图片压缩+ios图片角度旋转
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图片角度旋转的更多相关文章
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
- 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器
前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...
- Android 简单介绍图片压缩和图片内存缓存
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...
- js前端实现多图图片上传预览
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- Java实现图片压缩代码,图片大小转换
在很多项目中我们会把上传的图片做处理,比较图片上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的高清图片,我们可以通过代码来做压缩.在我的项目中我们压缩图片的目的是让web页面打开的速度很快,并 ...
- UIImage 和 iOS 图片压缩UIImage / UIImageVIew
UIImageView 制作气泡 stretchableImageWithLeftCapWidth http://blog.csdn.net/justinjing0612/article/detail ...
- iOS,图片处理
1.旋转图片 2.缩放图片 3.截取图片指定区域 4.祛除图片白色背景,弄成透明png 5.将UIView转化为UIImage,并转化为data和base64 6.将视频一帧(CMSampleBuff ...
- Java后端实现图片压缩技术
今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...
- Android webview实现上传图片的效果(图片压缩)
mainactivity代码 package com.bwie.webviewupload; import java.io.ByteArrayInputStream; import java.io.B ...
随机推荐
- Spark算子--cogroup
转载请标明出处http://www.cnblogs.com/haozhengfei/p/b612b1e6d9b951fad5574cd0ce573d7e.html cogroup--Transform ...
- github网站介绍、并使用git命令管理github(详细描述)
本章学习: 1)熟悉github网站 2)通过git命令远程管理github, 3)git命令使用ssh key密钥无需输入账号密码 1.首先我们来熟悉github网站 1.1 注册github 登录 ...
- 云计算之路-阿里云上:节点 CPU 波动引发 docker swarm 集群故障
非常抱歉,今天 10:05-10:20 左右,我们用阿里云服务器搭建的 docker swarm 集群又出现故障,又是因为突然的节点 CPU 波动. 受这次故障影响的站点有 闪存,博问,班级,园子,短 ...
- sublime text如何保存为uft-8无bom编码格式文件
https://jingyan.baidu.com/article/9158e000388092a2541228b6.html 今天发现自己的文件突然多了很多特殊符号,真是奇了怪,查找html里面也并 ...
- Python3 的元组
元组(tuple):戴上了枷锁的列表 元组与列表非常相似但是元组内元素的类型相同,且元组内的元素不能修改 1.创建元组的方法 与列表不同创建元组大部分情况下是用小括号,例如 tuple1=(1,2,3 ...
- windows下安装redis3.2.100单机和集群详解
下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 我下载的是3.2.100版本的Redis-x64-3.2.100.zip ...
- 基于 HTML5 WebGL 的 3D 网络拓扑结构图
现在,3D 模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源:在科学领域将它们作为化合物 ...
- RequireJS(一)
RequireJS: RequireJS中文网:http://www.requirejs.cn/ 解决HTML引入大量js文件导致的问题: 首先是加载的时候,浏览器会停止网页渲染,加载文件越多,网页失 ...
- 转:Python之路,Day6 - 面向对象学习
这篇文章写的不错,转来收了 转自:http://www.cnblogs.com/alex3714/articles/5188179.html 本节内容: 面向对象编程介绍 为什么要用面向对象进 ...
- PUTTY无法远程连接服务器故障解决[转]
对于一个刚刚了解putty工具的新手来说,在putty工具使用中有时出现了问题而无法解决.今天就来介绍怎么解决putty无法远程连接服务器的故障. 用putty远程连接服务器时,提示错误 server ...