js 压缩图片 H5

转载自:http://www.cnblogs.com/vaal-water/p/3642594.html

原理 用 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(',')[0].indexOf('base64') !== -1 ) {
        byteString = atob(dataURI.split(',')[1])
    } else {
        byteString = decodeURI(dataURI.split(',')[1])
    }

    mimestring = dataURI.split(',')[0].split(':')[1].split(';')[0]

    var content = new Array();
    for (var i = 0; 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,0,0);
        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 || 1 == scale ) return cbk(files)
    var files_count = files.length    
        ,ret = []
    
    for (var i = 0 ,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 <= 0 ) cbk && cbk(ret)

                })
        };
        fReader.readAsDataURL(files[i]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值