zoukankan      html  css  js  c++  java
  • AngularJs + html 5 实现 裁剪上传

    直接上代码 

    directive.js

    app.directive('fileUploadersm', function () {
        return {
            restrict: 'E',
            transclude: true,
            template: '<input type="file" accept="images/*" id="files" >' + '<div class="containertsm"></div><button ng-click="upload()" class="btn btn-danger">确定上传</button><br/>' + '<ul><li ng-repeat="file in files"> - </li></ul>',
            controller: function ($scope, $fileUpload) {
                $scope.notReady = true;
                $scope.addfood = function () {
                    $fileUpload.upload($scope.files);
                };
            },
            link: function ($scope, $element) {
                ////////////
                var tmp = $('<div class="resizer">' + '<div class="inner">' + '<img class="imgs">' + '<div class="frames"></div>' + '</div>' + '<button class="ok">✓</button>' + '</div>');
                $.imageResizer = function () {
                    if (Uint8Array && HTMLCanvasElement && atob && Blob) {
                    }
                    else {
                        return false;
                    }
                    var resizer = tmp.clone();
                    resizer.image = resizer.find('img')[0];
                    resizer.frames = resizer.find('.frames');
                    resizer.okButton = resizer.find('button.ok');
                    resizer.frames.offset = {
                        top: 0,
                        left: 0
                    };
                    resizer.okButton.click(function () {
                        resizer.clipImage();
                    });
                    resizer.clipImage = function () {
                        var nh = this.image.naturalHeight, nw = this.image.naturalWidth, size = nw > nh ? nh : nw;
                        size = size > 150 ? 150 : size;
                        var canvas = $('<canvas class="tcanvas" width="' + size + '" height="' + size + '"></canvas>')[0],
                            ctx = canvas.getContext('2d'),
                            scale = nw / this.offset.width,
                            x = this.frames.offset.left * scale,
                            y = this.frames.offset.top * scale,
                            w = this.frames.offset.size * scale,
                            h = this.frames.offset.size * scale;
                        ctx.drawImage(this.image, x, y, w, h, 0, 0, size, size);
    
                        var src = canvas.toDataURL();
                        this.canvas = canvas;
                        this.append(canvas);
                        this.addClass('uploading');
                        this.removeClass('have-img');
                        src = src.split(',')[1];
                        if (!src)
                            return this.doneCallback(null);
                        src = window.atob(src);
                        var ia = new Uint8Array(src.length);
                        for (var i = 0; i < src.length; i++) {
                            ia[i] = src.charCodeAt(i);
                        }
                        ;
                        this.doneCallback(new Blob([ia], { type: "image/png" }));
                        Id = new Blob([ia], { type: "image/png" });//这里Id  存放的就是裁剪之后的相片你可以自定义全局参数
                    };
                    resizer.resize = function (file, done) {
                        this.reset();
                        this.doneCallback = done;
                        this.setFrameSize(0);
                        this.frames.css({
                            top: 0,
                            left: 0
                        });
                        var reader = new FileReader();
                        reader.onload = function () {
                            resizer.image.src = reader.result;
                            reader = null;
                            resizer.addClass('have-img');
                            resizer.setFrames();
                        };
                        reader.readAsDataURL(file);
                    };
                    resizer.reset = function () {
                        this.image.src = '';
                        this.removeClass('have-img');
                        this.removeClass('uploading');
                        this.find('canvas').detach();
                    };
                    resizer.setFrameSize = function (size) {
                        this.frames.offset.size = size;
                        return this.frames.css({
                             size + 'px',
                            height: size + 'px'
                        });
                    };
                    resizer.getDefaultSize = function () {
                        var width = this.find(".inner").width(), height = this.find(".inner").height();
                        this.offset = {
                             width,
                            height: height
                        };
                        console.log(this.offset);
                        return width > height ? height : width;
                    };
                    resizer.moveFrames = function (offset) {
                        var x = offset.x, y = offset.y, top = this.frames.offset.top, left = this.frames.offset.left, size = this.frames.offset.size, width = this.offset.width, height = this.offset.height;
                        if (x + size + left > width) {
                            x = width - size;
                        }
                        else {
                            x = x + left;
                        }
                        ;
                        if (y + size + top > height) {
                            y = height - size;
                        }
                        else {
                            y = y + top;
                        }
                        ;
                        x = x < 0 ? 0 : x;
                        y = y < 0 ? 0 : y;
                        this.frames.css({
                            top: y + 'px',
                            left: x + 'px'
                        });
                        this.frames.offset.top = y;
                        this.frames.offset.left = x;
                    };
                    (function () {
                        var time;
                        function setFrames() {
                            var size = resizer.getDefaultSize();
                            resizer.setFrameSize(size);
                        }
                        ;
                        window.onresize = function () {
                            clearTimeout(time);
                            time = setTimeout(function () {
                                setFrames();
                            }, 1000);
                        };
                        resizer.setFrames = setFrames;
                    })();
                    (function () {
                        var lastPoint = null;
                        function getOffset(event) {
                            event = event.originalEvent;
                            var x, y;
                            if (event.touches) {
                                var touch = event.touches[0];
                                x = touch.clientX;
                                y = touch.clientY;
                            }
                            else {
                                x = event.clientX;
                                y = event.clientY;
                            }
                            if (!lastPoint) {
                                lastPoint = {
                                    x: x,
                                    y: y
                                };
                            }
                            ;
                            var offset = {
                                x: x - lastPoint.x,
                                y: y - lastPoint.y
                            };
                            lastPoint = {
                                x: x,
                                y: y
                            };
                            return offset;
                        }
                        ;
                        resizer.frames.on('touchstart mousedown', function (event) {
                            getOffset(event);
                        });
                        resizer.frames.on('touchmove mousemove', function (event) {
                            if (!lastPoint)
                                return;
                            var offset = getOffset(event);
                            resizer.moveFrames(offset);
                        });
                        resizer.frames.on('touchend mouseup', function (event) {
                            lastPoint = null;
                        });
                    })();
                    return resizer;
                };
                var resizer = $.imageResizer(), resizedImage;
                if (!resizer) {
                    resizer = $("<p>Your browser doesn't support these feature:</p><ul><li>canvas</li><li>Blob</li><li>Uint8Array</li><li>FormData</li><li>atob</li></ul>");
                }
                ;
                $('.containertsm').append(resizer);
                ///////////////////
                var fileInput = $element.find('input[type="file"]');
                fileInput.bind('change', function (e) {
                    var file = this.files[0];
                    resizer.resize(file, function (file) {
                        resizedImage = file;
                    });
                    $scope.notReady = e.target.files.length == 0;
                    $scope.files = [];
                    for (i in e.target.files) {
                        //Only push if the type is object for some stupid-ass reason browsers like to include functions and other junk
                        if (typeof e.target.files[i] == 'object')
                            $scope.files.push(e.target.files[i]);
                    }
                });
                // var file=this.files[0];
                // resizer.resize(file,function(file){
                //     resizedImage=file;
                // });
            }
        };
    });
    

      部分内容 请参照 html5 实现本地上传裁剪 http://www.webrube.com/jquery-html5-web_rube/4300

    html 代码

    <div class="col-sm-6">
                    <div>
                        <file-uploader></file-uploader>
                    </div>
    </div>

      

  • 相关阅读:
    springboot:快速构建一个springboot项目
    SpringBoot Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    springboot添加swagger2组件
    Mysql实现企业级数据库主从复制架构实战
    方案优化:网站实现扫描二维码关注微信公众号,自动登陆网站并获取其信息
    网站实现扫描二维码关注微信公众号,自动登陆网站并获取其信息
    九度OJ 1402 特殊的数 -- 位操作
    九度OJ 1385 重建二叉树
    九度OJ 1386 旋转数组的最小数字 【算法】
    九度OJ 城际公路网 -- 图论
  • 原文地址:https://www.cnblogs.com/wohenxion/p/4478541.html
Copyright © 2011-2022 走看看