成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

移動(dòng)端預(yù)覽壓縮上傳圖片

Chiclaim / 1705人閱讀

摘要:移動(dòng)端預(yù)覽壓縮上傳圖片推薦一個(gè)使用成熟的解決方案文章已同步我的筆記,歡迎大家加,加后人生更加美好原理介紹移動(dòng)端圖片上傳,通過(guò)生成圖片資源進(jìn)行預(yù)覽,通過(guò)進(jìn)行圖片的壓縮,將圖片轉(zhuǎn)換成對(duì)象上傳。

移動(dòng)端預(yù)覽壓縮上傳圖片

推薦一個(gè)使用成熟的解決方案:https://github.com/think2011/...

文章已同步我的github筆記https://github.com/ymblog/blog,歡迎大家加star~~,加star后人生更加美好……
原理介紹

移動(dòng)端圖片上傳,通過(guò)FileReader生成base64圖片資源進(jìn)行預(yù)覽,通過(guò)canvas進(jìn)行圖片的壓縮,將圖片url轉(zhuǎn)換成Blob對(duì)象上傳。

實(shí)現(xiàn)方案

初始頁(yè)面布局




    
    圖片上傳

    

    
    

使用FileReader進(jìn)行圖片預(yù)覽

/**
 * [previewImg 預(yù)覽圖片]
 * @param  {[type]} input [文件上傳input]
 * @param  {[type]} obj   [description]
 * @return {[type]}       [description]
 */
function previewImg(input,imgObj) {
    var maxsize = 300 * 1024;//超過(guò)300k進(jìn)行壓縮
    //是否支持
    if (typeof FileReader === "undefined") {
        alert("抱歉,你的瀏覽器不支持 FileReader,請(qǐng)使用現(xiàn)代瀏覽器操作!");
        input.setAttribute("disabled","disabled");
    }
    if(input.files && input.files[0]){
        var file = input.files[0],
            reader = new FileReader();
        if(!/image/w+/.test(file.type)) {
            alert("不是有效的圖片文件!");
            return;
        }
        reader.onload = function(e){
            var result = this.result;//獲取到base64的圖片
            //大于300k圖片進(jìn)行壓縮
            if(result.length >= maxsize){
                var img = new Image();
                img.src = result;
                img.onload = function(){
                    compressSrc = compress(img,0.8,100);
                    $(imgObj).setAttribute("src",compressSrc);
                    //ajax dataURLtoBlob(compressSrc);
                }
            }else{
                $(imgObj).setAttribute("src",result);
                //ajax dataURLtoBlob(result);
            }
        }
    }
}

使用canvas圖片壓縮,不過(guò)在ios中圖片大于2000000像素就無(wú)法使用canvas壓縮,就需要瓦片繪制。

/**
 * [compress 壓縮圖片]
 * @param  {[dom]} sourceImg [圖片dom]
 * @param  {[int]0-1} scale     [縮小的尺寸比例]
 * @param  {[int]0-100} quality   [清晰質(zhì)量]
 * @return {[object]}           [圖片源]
 */
function compress(sourceImg,scale,quality){
    var area = sourceImg.width * sourceImg.height,//源圖片的總大小
        height = sourceImg.height * scale,
        width = sourceImg.width * scale,
        compressCvs = document.createElement("canvas");//壓縮的圖片畫(huà)布
    //壓縮的圖片配置寬高
    compressCvs.width = width;
    compressCvs.height = height;
    var compressCtx = compressCvs.getContext("2d");
    //解決ios 圖片大于2000000像素?zé)o法用drawImage的bug
    if(area > 2000000 && navigator.userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/)){
        //瓦片繪制
        var smallCvs = document.createElement("canvas"),
            smallCtx = smallCvs.getContext("2d"),
            count = Math.ceil(area / 1000000),//分割的數(shù)量
            cvsWidth = width / count,//每個(gè)小canvas的寬度
            picWidth = sourceImg.width / count;//分割成小圖片的寬度
        smallCvs.height = compressCvs.height;
        smallCvs.width =  width / count;
        //拼湊成大的canvas
        for(var i = 0;i < count;i ++){
            smallCtx.drawImage(sourceImg,i*picWidth,0,picWidth,sourceImg.height,0,0,cvsWidth,height);
            compressCtx.drawImage(smallCvs,i*cvsWidth,0,cvsWidth,height);
        }
    }else{
        compressCtx.drawImage(sourceImg,0,0,sourceImg.width,sourceImg.height,0,0,width,height);
    }
    //將canvas轉(zhuǎn)換成base64
    return compressCvs.toDataURL("image/jpeg",quality/100);
}
function $(id){
    return document.getElementById(id);
}

將圖片url轉(zhuǎn)換為blob對(duì)象

/**
 * [dataURLtoBlob 將base64轉(zhuǎn)換為blob對(duì)象]
 * @param  {[type]} dataurl [圖片源base64]
 * @return {[object]}         [圖片源blob對(duì)象]
 */
function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}
使用說(shuō)明

這個(gè)只是一個(gè)移動(dòng)端預(yù)覽壓縮上傳圖片實(shí)現(xiàn)的demo,會(huì)有一些兼容性和bug問(wèn)題,大家可以自己修改和擴(kuò)展

結(jié)束,撒花~~~

文章已同步我的github筆記https://github.com/ymblog/blog,歡迎大家加star~~,加star后人生更加美好……

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91622.html

相關(guān)文章

  • 移動(dòng)圖片上傳旋轉(zhuǎn)、壓縮的解決方案

    摘要:上傳的文件經(jīng)過(guò)就可以實(shí)現(xiàn)預(yù)覽圖片了,這方面不清楚的可以查看進(jìn)階系列文件上傳下載旋轉(zhuǎn)旋轉(zhuǎn)需要用到的方法。 前言 在手機(jī)上通過(guò)網(wǎng)頁(yè) input 標(biāo)簽拍照上傳圖片,有一些手機(jī)會(huì)出現(xiàn)圖片旋轉(zhuǎn)了90度d的問(wèn)題,包括 iPhone 和個(gè)別三星手機(jī)。這些手機(jī)豎著拍的時(shí)候才會(huì)出現(xiàn)這種問(wèn)題,橫拍出來(lái)的照片就正常顯示。因此,可以通過(guò)獲取手機(jī)拍照角度來(lái)對(duì)照片進(jìn)行旋轉(zhuǎn),從而解決這個(gè)問(wèn)題。 Orientatio...

    blair 評(píng)論0 收藏0
  • 圖片上傳預(yù)覽轉(zhuǎn)壓縮并轉(zhuǎn)base64詳解(dShowImg64.js)

    摘要:本次的內(nèi)容是圖片的上傳預(yù)覽。待上傳圖像點(diǎn)擊藍(lán)色框內(nèi),可以選擇文件,移動(dòng)端選擇拍照或選擇圖片進(jìn)行上傳。部分請(qǐng)點(diǎn)擊這層就是加號(hào)圖像是轉(zhuǎn)碼后顯示圖像的地方。最后的預(yù)覽圖像地址以后會(huì)加入更多的小插件。 hello,大家好,游戲開(kāi)始了,歡迎大家收看這一期的講解。本次的內(nèi)容是圖片的上傳預(yù)覽。最后發(fā)源碼鏈接。廢話不多說(shuō),先上圖。showImg(https://segmentfault.com/img...

    NeverSayNever 評(píng)論0 收藏0
  • 圖片上傳預(yù)覽轉(zhuǎn)壓縮并轉(zhuǎn)base64詳解(dShowImg64.js)

    摘要:本次的內(nèi)容是圖片的上傳預(yù)覽。待上傳圖像點(diǎn)擊藍(lán)色框內(nèi),可以選擇文件,移動(dòng)端選擇拍照或選擇圖片進(jìn)行上傳。部分請(qǐng)點(diǎn)擊這層就是加號(hào)圖像是轉(zhuǎn)碼后顯示圖像的地方。最后的預(yù)覽圖像地址以后會(huì)加入更多的小插件。 hello,大家好,游戲開(kāi)始了,歡迎大家收看這一期的講解。本次的內(nèi)容是圖片的上傳預(yù)覽。最后發(fā)源碼鏈接。廢話不多說(shuō),先上圖。showImg(https://segmentfault.com/img...

    wums 評(píng)論0 收藏0
  • 圖片上傳預(yù)覽轉(zhuǎn)壓縮并轉(zhuǎn)base64詳解(dShowImg64.js)

    摘要:本次的內(nèi)容是圖片的上傳預(yù)覽。待上傳圖像點(diǎn)擊藍(lán)色框內(nèi),可以選擇文件,移動(dòng)端選擇拍照或選擇圖片進(jìn)行上傳。部分請(qǐng)點(diǎn)擊這層就是加號(hào)圖像是轉(zhuǎn)碼后顯示圖像的地方。最后的預(yù)覽圖像地址以后會(huì)加入更多的小插件。 hello,大家好,游戲開(kāi)始了,歡迎大家收看這一期的講解。本次的內(nèi)容是圖片的上傳預(yù)覽。最后發(fā)源碼鏈接。廢話不多說(shuō),先上圖。showImg(https://segmentfault.com/img...

    zorro 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<