擷取圖片生成頭像外掛

guimeisang發表於2019-03-04

上傳頭像外掛

目的: 幫助開發者快速開發上傳頭像功能點

背景: 現在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`);
        }
    });複製程式碼

相關文章