file上传图片,base64转换、压缩图片、预览图片、将图片旋转到正确的角度
/**
* 将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转换、压缩图片、预览图片、将图片旋转到正确的角度的更多相关文章
- WPF图片预览之移动、旋转、缩放
原文:WPF图片预览之移动.旋转.缩放 RT,这个功能比较常见,但凡涉及到图片预览的都跑不了,在说自己的实现方式前,介绍一个好用的控件:Extended.Toolkit中的Zoombox,感兴趣的同学 ...
- Java带图片预览功能的图片上传兼容火狐ie
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js实现移动端图片预览:手势缩放, 手势拖动,双击放大...
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- vue常用插件之图片预览
v-viewer(1.4.2) 非常实用的图片预览插件,支持旋转.缩放.翻转等操作 一.npm安装 npm i v-viewer -S 二.全局引入(main.js中) import 'viewerj ...
- Wx-小程序-图片预览、保存
点击图片预览 长按图片保存 点击按钮保存到手机相册 view: <!--wxml--> <text>点击图片预览.长按保存图片.点击按钮保存到系统相册</text> ...
- jquery解决file上传图片+图片预览
js解决file上传图片+图片预览 demo案例中代码为js原生控制,可以根据项目的需求修改为jquery操作 <!DOCTYPE html><html lang="en& ...
- 一段上传图片预览JS脚本,Input file图片预览的实现
在深圳做项目的时候,需要一个用户上传头像预览的功能!是在网上找了好多,都不太满意.要么是flash的,要么是Ajax上传后返回图片路径的,要么压根就是不能用的.幸运的是在这个项目以前有人写过一个图片预 ...
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...
- H5图片预览、压缩、上传
目标实现: 1.选择图片, 前端预览效果 2.图片大于1.2M的时候, 对图片进行压缩 3.以表单的形式上传图片 4.图片删除 预览效果图: 代码说明: 1.input:file选择图片 <!- ...
随机推荐
- 微信小程序快捷键(Mac和windows)
最近因为有点闲暇时间,所以抽空简单了解了小程序,因为小程序是使用微信开发者工具编码,不能使用其它编辑器,比如,Sublime,Hubilder等. 所以就百度了一下小程序快捷键,但总觉得不全,所以就去 ...
- Kali学习笔记32:Maltego、Exiftool
有段时间没学Kali里面的工具了 以前做信息收集的时候呢,忘记了两个很强大的工具:Maltego.Exiftool 先来看看Maltego: 这个工具不仅可以方便地收集DNS信息等等,强大地地方还在于 ...
- 使用QNetworkAccessManager实现Qt的FTP下载服务
从Qt5开始,官方推荐使用QNetworkAccessManager进行Ftp和http的上传和下载操作:Qt4中使用的QtFtp模块即作为独立模块,需要自己从github上进行下载编译后使用(官方地 ...
- base64之js压缩图片
在日常的一些项目中会有上传图片之类的接口,如果图片过大了再上传的时候是非常的耗时以及占用资源,在这里就给大家分享一下如何在js中把大的图片压缩成小的图片,我这里的功能是用户点击按钮调用相机或者选择文件 ...
- Java虚拟机监控命令
熟悉java的人都知道jdk的bin目录中有很多小工具,其中就包括用于监视虚拟机和故障处理的工具,今天就来仔细了解下各个工具的用法 jps JVM Process Status Tool,用于显示指定 ...
- C#生成MD5的方法
///C#生成MD5的方法 public static string GetMD5(string sDataIn) { MD5CryptoServiceProvider md5 = new MD5Cr ...
- Vc数据库编程基础MySql数据库的表查询功能
Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...
- 【杂谈】Tomcat 之 Lifecycle接口
前言 此篇随笔记录<How Tomcat works>中关于Lifecycle接口的相关总结 Lifecycle接口的主要目的 核心:统一. 已知Tomcat的卡特琳娜(Catalina) ...
- SharePoint之使用Jquery Mobile定制自己的手机页面
最近一直很忙,既要创业,又要工作,还有弄弄自己的小项目(已暂停,http://www.codelove1314.com/,如果你不愿意浪费你的业余时间,喜欢弄点小东西,请联系我),所以虽然有很多东西分 ...
- python函数的参数细节
按"指针"传递 python中变量赋值.参数传递都是通过"指针"拷贝的方式进行的.除了按"指针"拷贝,还有一种按值拷贝的方式,关于按值.按指 ...