原理 用 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的更多相关文章

  1. js压缩图片base64长度

    var myCanvas=$('.img-container > img').cropper('getCroppedCanvas'); (function (base64){ var image ...

  2. JS压缩图片(canvas),返回base64码

    上传图片时总会遇到图片过大上传不上去的问题,本方法是在网上搜的压缩图片的例子,我测试过了,确实能用,但是照搬别人的代码,发现压缩后图片会失真,不清晰,现经修改图片清晰度还可以,不仔细看差别不大,so, ...

  3. js 压缩图片(只缩小体积,不更改图片尺寸)

      1.情景展示 如上图所示,点击上传图片按钮,调用手机摄像头拍照功能. <input onchange="javascript:imgFun.uploadPicture();&quo ...

  4. js 压缩图片 上传

    感谢,参考了以下作者的绝大部分内容 https://blog.csdn.net/tangxiujiang/article/details/78755292 https://blog.csdn.net/ ...

  5. 了解JS压缩图片,这一篇就够了

    前言 公司的移动端业务需要在用户上传图片是由前端压缩图片大小,再上传到服务器,这样可以减少移动端上行流量,减少用户上传等待时长,优化用户体验. 插播一下,本文案例已整理成插件,已上传npm ,可通过 ...

  6. base64之js压缩图片

    在日常的一些项目中会有上传图片之类的接口,如果图片过大了再上传的时候是非常的耗时以及占用资源,在这里就给大家分享一下如何在js中把大的图片压缩成小的图片,我这里的功能是用户点击按钮调用相机或者选择文件 ...

  7. js压缩图片上传插件localResizeIMG

    示例 /** * 本地图片压缩后上传 */ $("#vfile").change(function(){ var _this = $(this); lrz(this.files[0 ...

  8. js压缩图片并上传,不失真,保证图片清晰度

    <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  9. html5+js压缩图片上传

    最近在折腾移动站的开发,涉及到了一个手机里面上传图片.于是经过N久的折腾,找到一个插件,用法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

随机推荐

  1. Java基础学习总结(59)——30 个java编程技巧

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  2. 【转】 C# ListView实例:文件图标显示

    [转] C# ListView实例:文件图标显示 说明:本例将目录中的文件显示在窗体的ListView控件中,并定义了多种视图浏览.通过调用Win32库函数实现图标数据的提取. 主程序: 大图标: 列 ...

  3. Test Precisely and Concretely

    Test Precisely and Concretely Kevlin Henney IT IS IMPORTANT TO TEST for the desired, essential behav ...

  4. OC的动态继承编译机制

    [问]为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却能够. [再问]为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却能够. [答]由于OC的动态继承编 ...

  5. (三 )kafka-jstorm集群实时日志分析 之 ---------jstorm集成spring 续(代码)

    本地模式启动的. package com.doctor.kafkajstrom; import java.util.HashMap; import java.util.Map; import java ...

  6. iOS 从各种效果图颜色标注生成 UIColor

    iOS 从各种效果图颜色标注生成 UIColor 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...

  7. AJAX入门---点滴的积累

    AJAX入门---点滴的积累 每次学习完一个内容总会写上几句话总结一下学习的内容.这不刚看完王兴魁老师讲的AJAX核心技术.如今回想梳理一下. 这套视频的内容不多,简单的解说了XMLHttpReque ...

  8. zzulioj--1712--神秘的数列(水题)

    1712: 神密的数列 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 122  Solved: 92 SubmitStatusWeb Board De ...

  9. 关于markdown的使用

    首先: https://www.cnblogs.com/jordangong/p/9804777.html 注意:提交博客时需将 Markdown 源码粘贴到编辑器中,且编辑器没有实时预览,可以上传后 ...

  10. mysql实战45讲读书笔记(二) 一条SQL更新语句是如何执行的 极客时间

    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...