仿照微信朋友缩略图实现

demo 


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,user-scalable=no,target-densitydpi=device-dpi" />
        <meta name="apple-mobile-web-app-capable" content="yes"/>
        <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
        <meta name="format-detection" content="telephone=no"/>
        <style>
            *{
                margin:0;
                padding:0;
            }
            div{
                /*display: inline-block;*/
               
                float: left;
            }
            
            h2{
                width:100%;
                text-align: center;
                margin-top:50px;
            }
            #minPic{
                margin-top:80px;
                text-align: center;
            }
            #maxPic{overflow: hidden;}
            #minPic img{ margin:0 2%;}
        </style>
    </head>
    <body>
        <section id="maxPic">
            <h2>仿照微信朋友圈正方形不失真缩略图</h2>
            <div>
                <h2>宽图</h2>
                <img src="8.png" alt="" />
            </div>
            <div>
                <h2>长图</h2>
                <img src="6.jpg" alt="" />
            </div>
            <div>
                <h2>正方形</h2>
                <img src="11.png" alt="" />
            </div> 
        </section>
        <h2>裁剪缩小后的图</h2>
        <section id="minPic">
            
            
        </section>
    </body>
    <script>
        !(function(win,doc){
            /**
             * *获取所需要缩略的图片
             * @param  {[type]} imgs [description]
             * @param  {[type]} w    [description]
             * @param  {[type]} h    [description]
             * @return {[type]}      [description]
             */
            function getImg(imgs,w,h){
                for (var i = 0; i < imgs.length; i++) {
                    imgs[i].οnlοad=function(){
                        var imgW=this.width,
                            imgH=this.height;
                            if(imgW/imgH>1){//宽图
                                var x=Math.floor((imgW-imgH)/2);
                                    imgTocanvas(this,x,0,imgH,imgH,w,h);      
                            }else if(imgH/imgW>1){//长图
                                 var y=Math.floor((imgH-imgW)/2);
                                   imgTocanvas(this,0,y,imgW,imgW,w,h); 
                            }else{//正方形
                                imgTocanvas(this,0,0,imgW,imgW,w,h); 
                            }
                    }
                };
            }
            /**
             * *裁减图片
             * @param  {[type]} img [description]
             * @param  {[type]} x   [description]
             * @param  {[type]} y   [description]
             * @param  {[type]} w   [description]
             * @param  {[type]} h   [description]
             * @param  {[type]} w1  [description]
             * @param  {[type]} h1  [description]
             * @return {[type]}     [description]
             */
            function imgTocanvas(img,x,y,w,h,w1,h1){
                var Mycanvas=doc.createElement("canvas"),
                    cont=Mycanvas.getContext("2d"),
                    minPic=doc.getElementById("minPic"),
                    imger=new Image();
                    Mycanvas.width=w1;
                    Mycanvas.height=h1;
                    cont.drawImage(img, x, y, w, h, 0, 0, w1, h1);
                    imger.setAttribute('crossOrigin', 'anonymous');
                    imger.src=Mycanvas.toDataURL("image/png");
                    imger.οnlοad=function(){
                        minPic.appendChild(this);
                    }
            }
            getImg(document.getElementsByTagName("img"),150,150);
        })(window,document)
    </script>
</html>

整个代码逻辑都比较简单,用到Canvas drawImage方法里面的几个参数 ,getImg主要是判断 是宽图,长图,还是正方形,然后再利用Canvas 的drawImage设置坐标和宽高,最后在输出,缩略图宽高不能比的话 我们样式控制会失真,需要一定比例的裁剪,我看了一下朋友圈的缩略图就是通过裁剪比例再变成正方形实现。

需要提醒大家的事 上面的代码需要在服务器上面运行,Canvas的图片好像不允许跨域。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值