js 压缩图片 H5
原理 用 canvas的 toDataURI (type , int ) 如果type参数的值为image/jpeg或image/webp,则第二个参数的值如果在0.0和1.0之间的话,会被看作是图片质量参数
dataURI转 blob的代码是 copy 来的
压缩代码
/*common*/
var canvasSupported = isCanvasSupported()
function dataURItoBlob(dataURI) {
// convert base64 to raw binary data held in a string
var byteString
,mimestring
if(dataURI.split(',')[].indexOf('base64') !== - ) {
byteString = atob(dataURI.split(',')[])
} else {
byteString = decodeURI(dataURI.split(',')[])
}
mimestring = dataURI.split(',')[].split(':')[].split(';')[]
var content = new Array();
for (var i = ; i < byteString.length; i++) {
content[i] = byteString.charCodeAt(i)
}
return new Blob([new Uint8Array(content)], {type: mimestring});
}
function imgScale (src , scale,cbk) {
if (!src) return cbk(false)
var _canvas = document.createElement('canvas')
var tImg = new Image
tImg.onload = function(){
var _context = _canvas.getContext('2d');
_context.drawImage(tImg,,);
var type = 'image/jpeg'
src = _canvas.toDataURL(type , scale)
var blob = dataURItoBlob(src)
cbk(blob)
/*
var r = _canvas.mozGetAsFile('f' , type)
cbk(r)
*/
};
tImg.src = src
}
function isCanvasSupported(){
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
}
exports.support = canvasSupported
/* opt {scale :0-1}*/
exports.zip = function(files ,opt,cbk){
opt = opt || {}
var scale = opt.scale
if (!canvasSupported) return cbk(files)
if (!scale || == scale ) return cbk(files)
var files_count = files.length
,ret = []
for (var i = ,j = files.length ; i<j ; i++){
var fReader = new FileReader();
fReader.onload = function (e){
var result = e.target.result
imgScale(result , scale ,function(file){
file && ret.push(file)
files_count--
if (files_count <= ) cbk && cbk(ret)
})
};
fReader.readAsDataURL(files[i]);
}
}
使用
var compress = require('app/compress')
if (compress.support){
compress.zip(files , {'scale':opt.compress} , function(files){
console.log(files)
//返回的 blob 对象可以 append 到 FormData对象上 用 ajax 上传
})
}
js 压缩图片 H5的更多相关文章
- js压缩图片base64长度
var myCanvas=$('.img-container > img').cropper('getCroppedCanvas'); (function (base64){ var image ...
- JS压缩图片(canvas),返回base64码
上传图片时总会遇到图片过大上传不上去的问题,本方法是在网上搜的压缩图片的例子,我测试过了,确实能用,但是照搬别人的代码,发现压缩后图片会失真,不清晰,现经修改图片清晰度还可以,不仔细看差别不大,so, ...
- js 压缩图片(只缩小体积,不更改图片尺寸)
1.情景展示 如上图所示,点击上传图片按钮,调用手机摄像头拍照功能. <input onchange="javascript:imgFun.uploadPicture();&quo ...
- js 压缩图片 上传
感谢,参考了以下作者的绝大部分内容 https://blog.csdn.net/tangxiujiang/article/details/78755292 https://blog.csdn.net/ ...
- 了解JS压缩图片,这一篇就够了
前言 公司的移动端业务需要在用户上传图片是由前端压缩图片大小,再上传到服务器,这样可以减少移动端上行流量,减少用户上传等待时长,优化用户体验. 插播一下,本文案例已整理成插件,已上传npm ,可通过 ...
- base64之js压缩图片
在日常的一些项目中会有上传图片之类的接口,如果图片过大了再上传的时候是非常的耗时以及占用资源,在这里就给大家分享一下如何在js中把大的图片压缩成小的图片,我这里的功能是用户点击按钮调用相机或者选择文件 ...
- js压缩图片上传插件localResizeIMG
示例 /** * 本地图片压缩后上传 */ $("#vfile").change(function(){ var _this = $(this); lrz(this.files[0 ...
- js压缩图片并上传,不失真,保证图片清晰度
<!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- html5+js压缩图片上传
最近在折腾移动站的开发,涉及到了一个手机里面上传图片.于是经过N久的折腾,找到一个插件,用法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
随机推荐
- LoadRunner监控Window/Unix系统资源的配置
LoadRunner监控Window/Unix系统资源需要做两件事情: 1.配置被监视的服务器,以便于LoadRunner能够获取系统资源使用情况的数据 2.在LoadRunner的Controlle ...
- HDU 4253 Two Famous Companies
Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...
- org.apache.hadoop.ipc.Client: Retrying connect to server
这个问题导致jps查看结点进程时发现找不到NodeManager或一段时间后消失,网上查找了很多博客,因hadoop版本不一样且出错的原因也可能不同,所以找了老半天. 步骤:jps --> 看l ...
- CURL库的宏定义列表
列表CURL库一共同拥有17个函数 curl_close:关闭CURL会话 curl_copy_handle:复制一个CURL会话句柄,同一时候3复制其全部參数 curl_errno:返回最后一个错误 ...
- 保留全部Android crash信息
保留全部Android crash信息 framework/base/core/java/com/android/internal/os/RuntimeInit.java 又一次以下这个函数,增加自己 ...
- Android蓝牙串口程序开发
本文主要介绍了针对android的蓝牙串口上位机开发. 程序下载地址:点击打开链接 一.帧定义 androidclient依照一定的数据帧格式通过蓝牙串口发送数据到连接到MCU的蓝牙从机.MCU接收到 ...
- 怎么用命令行运行jar文件
假设你配置好了jre环境,你如今有一个打包好的jar文件,你能够这样子開始运行 java -classpath example.jar mainClass -classpath告诉虚拟机在哪里找类的字 ...
- 如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
一.如何从 Datagrid 中获得单元格的内容 DataGrid 属于一种 ItemsControl, 因此,它有 Items 属性并且用ItemContainer 封装它的 items. 但是,W ...
- MyBatis数据持久化(三)增删改查
上篇文章中我们使用mybatis成功建立数据库会话,并从表中查询出相应的数据,本文在此基础上介绍MyBatis另外几种操作,即插入.修改.删除记录. 1.修改User.xml文件,增加几条sql语句: ...
- [转] CentOS 7 为firewalld添加开放端口及相关资料
转自http://www.cnblogs.com/hubing/p/6058932.html 1.运行.停止.禁用firewalld 启动:# systemctl start firewalld 查 ...