美文网首页
纯前端实现截图生成头像

纯前端实现截图生成头像

作者: kevin寻找好故事 | 来源:发表于2017-10-31 22:33 被阅读0次

    上传头像插件

    目的: 帮助开发者快速开发上传头像功能点

    背景: 现在b,g能搜到的头像上传插件并不太好用,所以想提供一个比较自由度的上传并且可以剪切的插件。

    资源: 具体资源请查看这里

    实现大致思路如下:

    1. 先有一个上传的(本地上传的功能),然后获取图片的地址。

    2. 获取图片地址之后,进行截取图片(这里推荐一个插件)点这里,具体怎么用就不再赘述。

    3. 等截取图片之后,需要将截取的文件转换为二进制大文件。$('#image').cropper('getCroppedCanvas').toBlob();

    4. 调取接口,将二进制大文件上传即可。

    直接上代码:

    1. 先引入如下文件
    
    cropper.js [点这里](https://github.com/fengyuanchen/cropperjs)
    
    
    1. 具体业务代码
    
    $(function () {
    
    var URL = window.URL || window.webkitURL;
    
    var $image = $('#image');
    
    var $rotate = $('#userImg_rotate');
    
    var $reUpload = $('#userImg_reUpload');
    
    var $zoomOut = $('#userImg_zoomOut');
    
    var $zoomIn = $('#userImg_zoomIn');
    
    var $save = $('#userImg_save');
    
    var croppable = false;
    
    var $previews = $('.userImg_preview');
    
    var options = {
    
    aspectRatio: 1,
    
    viewMode: 1,
    
    built: function () {
    
    croppable = true;
    
    },
    
    build: function (e) {
    
    var $clone = $(this).clone();
    
    $clone.css({
    
    display: 'block',
    
    width: '100%',
    
    minWidth: 0,
    
    minHeight: 0,
    
    maxWidth: 'none',
    
    maxHeight: 'none'
    
    });
    
    $previews.css({
    
    width: '100%',
    
    overflow: 'hidden'
    
    }).html($clone);
    
    },
    
    crop: function (e) {
    
    var imageData = $(this).cropper('getImageData');
    
    var previewAspectRatio = e.width / e.height;
    
    $previews.each(function () {
    
    var $preview = $(this);
    
    var previewWidth = $preview.width();
    
    var previewHeight = previewWidth / previewAspectRatio;
    
    var imageScaledRatio = e.width / previewWidth;
    
    $preview.height(previewHeight).find('img').css({
    
    width: imageData.naturalWidth / imageScaledRatio,
    
    height: imageData.naturalHeight / imageScaledRatio,
    
    marginLeft: -e.x / imageScaledRatio,
    
    marginTop: -e.y / imageScaledRatio
    
    });
    
    });
    
    }
    
    };
    
    var originalImageURL = $scope.userInfo_imgUrl;
    
    var uploadedImageURL;
    
    $scope.initCropper = function(){
    
    // init
    
    $image.attr('src',$scope.userInfo_imgUrl).cropper(options);
    
    };
    
    // rotate
    
    $rotate.on('click', function(){
    
    $image.cropper('rotate', 90);
    
    });
    
    // zoomOut
    
    $zoomOut.on('click',function(){
    
    $image.cropper('zoom', -0.1);
    
    });
    
    // zoomIn
    
    $zoomIn.on('click',function(){
    
    $image.cropper('zoom', 0.1);
    
    });
    
    // Move
    
    /*$move.on('click',function(){
    
    $image.cropper('setDragMode');
    
    });*/
    
    // reUpload
    
    $reUpload.on('click',function(){
    
    $image.cropper('destroy').attr('src', $scope.userInfo_imgUrl).cropper(options);
    
    if (uploadedImageURL) {
    
    URL.revokeObjectURL(uploadedImageURL);
    
    uploadedImageURL = '';
    
    }
    
    });
    
    // Keyboard
    
    $(document.body).on('keydown', function (e) {
    
    if (!$image.data('cropper') || this.scrollTop > 300) {
    
    return;
    
    }
    
    switch (e.which) {
    
    case 37:
    
    e.preventDefault();
    
    $image.cropper('move', -1, 0);
    
    break;
    
    case 38:
    
    e.preventDefault();
    
    $image.cropper('move', 0, -1);
    
    break;
    
    case 39:
    
    e.preventDefault();
    
    $image.cropper('move', 1, 0);
    
    break;
    
    case 40:
    
    e.preventDefault();
    
    $image.cropper('move', 0, 1);
    
    break;
    
    }
    
    });
    
    // 剪切和确定上传图片
    
    $save.on('click',function(){
    
    common.Loading.show();
    
    $('#image').cropper('getCroppedCanvas').toBlob(function (blob) {
    
    var formData = new FormData();
    
    formData.append('photoFile', blob);
    
    // 这里写入后端给你的上传接口
    
    $.ajax(API_URL+'', {
    
    method: "POST",
    
    data: formData,
    
    headers: {
    
    'auth-token' : common.Cookie.get('token')
    
    },
    
    processData: false,
    
    contentType: false,
    
    success: function (res) {
    
    common.Loading.hide();
    
    common.Toast.show('头像上传成功!');
    
    try{
    
    $scope.$apply(function(){
    
    $scope.isShowUnCompleteInfoBox = false;
    
    $scope.isShowCompleteInfoBox = false;
    
    $scope.userInfo_imgUrl = res.data;
    
    })
    
    }catch(err){
    
    console.log(err)
    
    }
    
    },
    
    error: function () {
    
    common.Toast.show('头像上传失败!');
    
    }
    
    });
    
    });
    
    })
    
    // 上传图片,这里传本地的图片并且获取一个本地图片的路径
    
    var $inputImage = $('#inputImage');
    
    if (URL) {
    
    $inputImage.change(function () {
    
    var files = this.files;
    
    var file;
    
    if (!$image.data('cropper')) {
    
    return;
    
    }
    
    if (files && files.length) {
    
    file = files[0];
    
    if (/^image\/\w+$/.test(file.type)) {
    
    if (uploadedImageURL) {
    
    URL.revokeObjectURL(uploadedImageURL);
    
    }
    
    uploadedImageURL = URL.createObjectURL(file);
    
    $image.cropper('destroy').attr('src', uploadedImageURL).cropper(options);
    
    $inputImage.val('');
    
    } else {
    
    common.Toast.show('请选择图片再上传!')
    
    }
    
    }
    
    });
    
    } else {
    
    $inputImage.prop('disabled', true).parent().addClass('disabled');
    
    }
    
    });
    
    

    相关文章

      网友评论

          本文标题:纯前端实现截图生成头像

          本文链接:https://www.haomeiwen.com/subject/yobipxtx.html