/**
* 将base64转换为文件对象
* (即用文件上传输入框上传文件得到的对象)
* @param {String} base64 base64字符串
*/
function convertBase64UrlToBlob(base64){
var base64Arr = base64.split(',');
if(base64Arr.length > ){
//如果是图片base64,去掉头信息
base64 = base64Arr[];
}
// 将base64解码
var bytes = atob(base64);
var bytesCode = new ArrayBuffer(bytes.length);
// 将base64转换为ascii码
for (var i = ; i < bytes.length; i++) {
bytesCode[i] = bytes.charCodeAt(i);
}
// 转换为类型化数组
var byteArray = new Uint8Array(bytesCode);
// 生成Blob对象(文件对象)
return new Blob( [byteArray] , {type : 'image/png'});
}
/**
* 压缩图片
* (压缩后返回的是base64,可以参照本目录下的convertBase64ToBlob.js,将base64还原为file input读取得到的文件对象)
* @param {Dom Object} $fileInput 文件上传输入框
* @param {Function} callback 压缩完成后的回调函数
* @return {Object} options 指定压缩到指定体积以下或按比率压缩,不指定不会压缩
*/
function compressImg($fileInput, callback, options) {
options = options || {};
// 绑定change事件
$fileInput.onchange = function ($event) {
var $target = $event.target;
if ($target.files && $target.files[]) {
// 用FileReader读取文件
var reader = new FileReader();
// 将图片读取为base64
reader.readAsDataURL($fileInput.files[]);
reader.onload = function(evt){
var base64 = evt.target.result;
// 创建图片对象
var img = new Image();
// 用图片对象加载读入的base64
img.src = base64;
img.onload = function () {
var that = this,
canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
canvas.setAttribute('width', that.width);
canvas.setAttribute('height', that.height);
// 将图片画入canvas
ctx.drawImage(that, , , that.width, that.height);
// 压缩到指定体积以下(M)
if(options.size){
var scale = 0.9;
while (base64.length / / > options.size) {
// 用canvas的toDataURL方法实现压缩
base64 = canvas.toDataURL('image/jpeg', scale);
// 降低压缩比率,直到压缩结果小于指定大小
scale = scale - 0.1;
}
} else if(options.scale){
// 按比率压缩
base64 = canvas.toDataURL('image/jpeg', options.scale);
}
callback(base64);
}
}
}
}
}
/**
* 上传之前预览图片
* @param {Dom Object} $fileInput 文件上传输入框
* @param {Dom Object} $previewImg 预览图片的image元素
*/
function previewImg($fileInput, $previewImg) {
$fileInput.onchange = function ($event) {
var $target = $event.target;
if ($target.files && $target.files[]) {
var reader = new FileReader();
reader.readAsDataURL($target.files[]);
reader.onload = function(evt){
var base64 = evt.target.result;
$previewImg.setAttribute('src', base64);
}
}
}
}
/**
* 将图片旋转到正确的角度
* (解决移动端上传的图片角度不正确的问题)
* (旋转后返回的是base64,可以参照本目录下的convertBase64ToBlob.js,将base64还原为file input读取得到的文件对象)
* @param {Dom Object} $fileInput 文件上传输入框
* @param {Function} callback 旋转完成后的回调函数
*/
function resetImgOrientation($fileInput, callback) {
// 绑定change事件
$fileInput.onchange = function ($event) {
var $target = $event.target;
if ($target.files && $target.files[]) {
// 获取图片旋转角度
getOrientation($target.files[], function (orientation) {
var reader = new FileReader();
reader.readAsDataURL($target.files[]);
reader.onload = function(evt){
var base64 = evt.target.result;
// 将图片旋转到正确的角度
resetOrientation(base64, orientation, function (resultBase64) {
callback(resultBase64);
});
}
});
}
}
} // 获取图片旋转的角度
function getOrientation(file, callback) {
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function(e) {
var view = new DataView(e.target.result);
if (view.getUint16(, false) != 0xFFD8) return callback(-);
var length = view.byteLength, offset = ;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += ;
if (marker == 0xFFE1) {
if (view.getUint32(offset += , false) != 0x45786966) return callback(-);
var little = view.getUint16(offset += , false) == 0x4949;
offset += view.getUint32(offset + , little);
var tags = view.getUint16(offset, little);
offset += ;
for (var i = ; i < tags; i++)
if (view.getUint16(offset + (i * ), little) == 0x0112)
return callback(view.getUint16(offset + (i * ) + , little));
}
else if ((marker & 0xFF00) != 0xFF00) break;
else offset += view.getUint16(offset, false);
}
return callback(-);
};
}
// 将图片旋转到正确的角度
function resetOrientation(srcBase64, srcOrientation, callback) {
var img = new Image();
img.onload = function() {
var width = img.width,
height = img.height,
canvas = document.createElement('canvas'),
ctx = canvas.getContext("2d");
// set proper canvas dimensions before transform & export
if ([,,,].indexOf(srcOrientation) > -) {
canvas.width = height;
canvas.height = width;
} else {
canvas.width = width;
canvas.height = height;
}
// transform context before drawing image
switch (srcOrientation) {
case : ctx.transform(-, , , , width, ); break;
case : ctx.transform(-, , , -, width, height ); break;
case : ctx.transform(, , , -, , height ); break;
case : ctx.transform(, , , , , ); break;
case : ctx.transform(, , -, , height , ); break;
case : ctx.transform(, -, -, , height , width); break;
case : ctx.transform(, -, , , , width); break;
default: ctx.transform(, , , , , );
}
// draw image
ctx.drawImage(img, , );
// export base64
callback(canvas.toDataURL('image/jpeg'));
};
img.src = srcBase64;
};

file上传图片,base64转换、压缩图片、预览图片、将图片旋转到正确的角度的更多相关文章

  1. WPF图片预览之移动、旋转、缩放

    原文:WPF图片预览之移动.旋转.缩放 RT,这个功能比较常见,但凡涉及到图片预览的都跑不了,在说自己的实现方式前,介绍一个好用的控件:Extended.Toolkit中的Zoombox,感兴趣的同学 ...

  2. Java带图片预览功能的图片上传兼容火狐ie

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  4. vue常用插件之图片预览

    v-viewer(1.4.2) 非常实用的图片预览插件,支持旋转.缩放.翻转等操作 一.npm安装 npm i v-viewer -S 二.全局引入(main.js中) import 'viewerj ...

  5. Wx-小程序-图片预览、保存

    点击图片预览 长按图片保存 点击按钮保存到手机相册 view: <!--wxml--> <text>点击图片预览.长按保存图片.点击按钮保存到系统相册</text> ...

  6. jquery解决file上传图片+图片预览

    js解决file上传图片+图片预览 demo案例中代码为js原生控制,可以根据项目的需求修改为jquery操作 <!DOCTYPE html><html lang="en& ...

  7. 一段上传图片预览JS脚本,Input file图片预览的实现

    在深圳做项目的时候,需要一个用户上传头像预览的功能!是在网上找了好多,都不太满意.要么是flash的,要么是Ajax上传后返回图片路径的,要么压根就是不能用的.幸运的是在这个项目以前有人写过一个图片预 ...

  8. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...

  9. H5图片预览、压缩、上传

    目标实现: 1.选择图片, 前端预览效果 2.图片大于1.2M的时候, 对图片进行压缩 3.以表单的形式上传图片 4.图片删除 预览效果图: 代码说明: 1.input:file选择图片 <!- ...

随机推荐

  1. Docker学习笔记-磁盘挂载运行.netcore

    前言: 环境:centos7.5 64 位 正文: 首先我们在宿主机上安装 .NET Core SDK sudo rpm --import https://packages.microsoft.com ...

  2. 如何解决微信小程序界面适配问题-引用-生命周期回调函数-优化机制-样式引入

    如何解决微信小程序界面适配问题 .wxss page{ height: 100%; width:750rpx; } this.setData({ imageWidth: wx.getSystemInf ...

  3. 树莓派配置wifi链接

    使用树莓派链接网络是必然的,这里讲一讲如何连接到wifi. 扫描WIFI sudo iwlist wlan0 scan 扫描后得到以下结果 这里的“ESSID”是无线网的名称. 添加有密码的WIFI网 ...

  4. kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器

    前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...

  5. spring-boot-maven-plugin插件的作用

    要记住:spring-boot-maven-plugin插件在打Jar包时会引入依赖包 可以打成直接运行的Jar包 maven项目的pom.xml中,添加了org.springframework.bo ...

  6. 【Android基础】Fragment 详解之Fragment生命周期

    上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的 ...

  7. 原生js ajax请求

    什么是ajax AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新, ...

  8. 使用 trash 避免 rm -rf 悲剧

    昨晚做了一个令人痛心疾首的操作,rm -rf something,把我个人电脑里的重要文件夹给删掉了,懵逼了半天才缓过来.还好是个人文件,不对公司造成影响.这件事也让我意识到 rm -rf 确实是个高 ...

  9. HTTPS过程以及详细案例

    1.HTTPS的过程 1.客户端向服务端发送请求,客户端主要向服务器提供以下信息: 支持的协议版本,比如TLS 1.0版. 一个客户端生成的随机数,稍后用于生成"对话密钥". 支持 ...

  10. HTTP的基本原理

    用户访问万维网文档,万维网文档之间的链接以及万维网文档中数据传送到用户计算机,这些功能的实现都是由超文本传输协议 HTTP(HyperTextTransfer Protocol) 负责完成的. HTT ...