完美适配移动端的裁剪图片--jQuery-photoClip

815 阅读2分钟

通过jQuery-photoClip插件可以实现适配移动端进行裁剪,旋转、缩放等功能。 效果网站:www.jylynn.top/photoClip/ 效果:

在这里插入图片描述
实现如下:

  body,html{
            font-size: 50px;
        }
        .main{
            width: 100%;
            height: 100%;
        }
        /* 上传按钮盒子 */
        .upload-btn-box{
            width: 2.4rem;
            height: 1.8rem;
            background: #EFEFEF;
            margin-top: .16rem;
            position: relative;
        }
        /* 上传按钮 */
        .imgboxa{
            width: 100%;
            height: 100%;
            display: inline-block;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate3d(-50%,-50%,0);
            -moz-transform: translate3d(-50%,-50%,0);
            -ms-transform: translate3d(-50%,-50%,0);
            -webkit-transform: translate3d(-50%,-50%,0);
            -o-transform: translate3d(-50%,-50%,0);
            cursor: pointer;
        }
        .inputFile{
            position: absolute;
            left: 0;
            top: 0;
            height: 100%;
            width: 100%;
            opacity: 0;
            z-index: 2;
        }
        .add-icon{
            width: .4rem;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%,-50%);
        }
        /* 裁剪画布 */
        #clipArea{
            height: 100%;
            position: absolute;
            z-index: 998;
            width: 100%;
            background: rgba(0,0,0,.7);
            display: none;
            top: 0;
            left: 0;
        }
        /* 裁剪后图片显示区域 */
        #view-photo{
            position: absolute;
            width: 100%;
            height: 100%;
            border: .02rem solid #E6E9EF;
            background-color: #fff !important;
            display: none;
        }
        /* 删除按钮 */
        .del-photo{
            content: "";
            display: inline-block;
            position: absolute;
            width: .36rem;
            height: .36rem;
            background: url(./close2@2x.png) no-repeat;
            background-size: 100% 100%;
            right: 0;
            top: 0;
        }
        /* 截取按钮 */
        .clip-button-area{
            display: none;
            height: 1rem;
            width: 100%;
            position: absolute;
            bottom: 0;
            background: rgba(0,0,0,.6);
            border-top: .02rem solid #fff;
            line-height: 1rem;
            text-align: center;
            z-index: 999;
        }
        #clipBtn{
            font-size: .36rem;
            color: #fff;
        }
 <div class="main">
        <p style='font-size: .28rem;'>头像:</p>
        <div class="upload-btn-box">
            <a href="javascript:;" class="imgboxa">
                <input type="file" id="file" class="inputFile">
                <img src="./addShape@2x.png" class="add-icon" alt="">
            </a>
            <!-- 裁剪后图片显示区域 -->
            <div id="view-photo">
                <span class="del-photo"></span>
            </div>
        </div>
        <!-- 裁剪画布 -->
        <div id="clipArea">

        </div>
        <!-- 裁剪按钮 -->
        <div class="clip-button-area">
            <div id="clipBtn">截取</div>
        </div>
    </div>
    <script src='./jquery-2.1.4.min.js'></script>
    <script src="./image-deal/hammer.min.js"></script>
    <script src="./image-deal/iscroll-zoom-min.js"></script>
    <script src="./image-deal/lrz.all.bundle.js"></script>
    <script src="./image-deal/PhotoClip.js"></script>

JS代码:

<script>
        var _this = this;
         var one_obj = {
           /**
            * @param base64Codes
            *        图片的base64编码
            */
           //  可不用
           funUploadFile: function(base64Codes){
               var self = this;
               var formData = new FormData();
               //convertBase64UrlToBlob函数是将base64编码转换为Blob
               //append函数的第一个参数是后台获取数据的参数名,在php中用$FILES['imageName']接收,
               formData.append("imageName",self.convertBase64UrlToBlob(base64Codes));
               //ajax 提交form
               
           },

           /**
            * 将以base64的图片url数据转换为Blob
            * @param urlData
            *            用url方式表示的base64图片数据
            */
           //  可不用
           convertBase64UrlToBlob: function(urlData){
               //去掉url的头,并转换为byte
               var bytes=window.atob(urlData.split(',')[1]);

               //处理异常,将ascii码小于0的转换为大于0
               var ab = new ArrayBuffer(bytes.length);
               var ia = new Uint8Array(ab);
               for (var i = 0; i < bytes.length; i++) {
                   ia[i] = bytes.charCodeAt(i);
               }
               // 此处type注意与photoClip初始化中的outputType类型保持一致
               return new Blob( [ab] , {type : 'image/jpeg'});
           },
           //初始化
           init: function() {
               var self = this;
               clipArea = new PhotoClip('#clipArea', {
                   size: [ 300, 300],// 截取框的宽和高组成的数组。默认值为[260,260]
                   outputSize:[  300, 300],// 输出图像的宽和高组成的数组。默认值为[0,0],表示输出图像原始大小
                   file: "#file", //上传图片的<input type="file">控件的选择器或者DOM对象
                   view: "#view-photo", // 显示截取后图像的容器的选择器或者DOM对象
                   ok: "#clipBtn",
                   //img: 'img/mm.jpg',
                   loadStart: function() {
                       $('#clipArea').show();
                       $('.clip-button-area').show();
                   },
                   loadComplete: function() {
                   },
                   done: function(dataURL) {
                       $('#view-photo').show();
                       $('#clipArea').hide();
                       $('.clip-button-area').hide();
                   },
                   fail: function(msg) {
                       // alert(msg);
                   }
               });
           },
           //销毁
           broke: function () {
               clipArea.clear();
               $('#view-photo').hide();
           }
       };

       one_obj.init();
       $('.del-photo').on('click',function () {
           // $('#view-photo').hide();
           $('#view-photo').css('background-image','');
           one_obj.broke();
       })
   </script>

遇到的坑:在插件网站找到的iscroll-zoom-min.js几个插件英文版本问题,会导致在手机上缩放时候会有问题,后面网上找到合适的版本解决了。

相关插件可在此下载代码文件

感谢你的观看,觉得可以的可以点个关注~