canvas做的图片裁切

/*
* for example
<div id="box" style="position: relative">
    <canvas width="500" height="200"></canvas>
    <div id="newImg"></div>
</div>
<script>
var cpimg = new corpImg();
cpimg.init({
    box: "box",
    imgurl: "http://img.ifeng.com/tres/auto/upload/images/2010/0330/095000/0_251173_d3560254d4e816866c41b2c1b1c88a70.jpg",
    newimgId : "newImg",
    callback: function(img) {

    }
})
</script>
*/
function corpImg() {}
corpImg.prototype = {
    constructor: corpImg,
    init : function (options) {
        if (typeof options != "object") return;
        this.box = document.getElementById(options.box);
        this.canvas = box.getElementsByTagName('canvas')[0];
        this.ctx = this.canvas.getContext('2d');
        this.img = new Image();
        this.wrap = null;

        var self = this;
        this.loadImg(options.imgurl, function() {
            self.ctx.drawImage(self.img, 0, 0);
        });

        this.canvas.addEventListener('mousedown', function(e){
            self.startCorp(e, self);
        }, false);
        this.canvas.addEventListener('mouseup', function(e) {
            self.stopCorp(e, self, function(xyArr) {
                var flag = self.ctx.getImageData(xyArr[0], xyArr[1], xyArr[2], xyArr[3]);

                var corpCanvas = document.createElement("canvas");
                self.box.appendChild(corpCanvas);
                var cpctx = corpCanvas.getContext('2d');
                corpCanvas.id = "corpCanvas";
                corpCanvas.style.position = "absolute";
                corpCanvas.width = xyArr[2];
                corpCanvas.height = xyArr[3];
                corpCanvas.style.left = xyArr[0]+"px";
                corpCanvas.style.top = xyArr[1]+"px";
                cpctx.putImageData(flag, 0, 0);
                flag = null;

                var ii = document.createElement('img');
                var newImg = document.getElementById(options.newimgId);
                ii.src = corpCanvas.toDataURL("image/png");
                newImg.innerHTML = "";
                newImg.appendChild(ii);
                options.callback(corpCanvas.toDataURL("image/png"));
            })
        }, false);

    },
    loadImg: function (src, callback) {
        this.img.src = src;
        this.img.onload = function() {
            callback();
        }
    },
    // 开始手动裁切
    startCorp: function(e, self) {
        self.ctx.clearRect(0,0, self.canvas.width, self.canvas.height);
        document.getElementById('corpCanvas') && self.box.removeChild(corpCanvas);
        self.ctx.drawImage(self.img, 0, 0);
        self.ctx.fillStyle = "rgba(0,0,0, .3)";
        self.ctx.fillRect(0,0, self.canvas.width, self.canvas.height);
        self.wrap = self.ctx.getImageData(0,0, self.canvas.width, self.canvas.height);
        self.dX = e.clientX - self.canvas.offsetLeft;
        self.dY = e.clientY - self.canvas.offsetTop;
        // console.log(self.dX+":"+self.dY);
        self.canvas.onmousemove = function(e) {
            self.corpIng(e, self);
        }
    },

    // 停止手动裁切
    stopCorp: function(e, self, callback) {
        self.wrap = null;
        self.uX = e.clientX - self.canvas.offsetLeft;
        self.uY = e.clientY - self.canvas.offsetTop;

        // console.log(self.uX+":"+self.uY+"::::::W="+(self.uX-self.dX)+":H="+(self.uY-self.dY));
        self.canvas.onmousemove = null;
        callback([(self.dX+1),(self.dY+1),Math.abs(self.uX-self.dX-2),Math.abs(self.uY-self.dY-2)]);
    },

    // 手动裁切中
    corpIng: function(e, self) {
        var x = e.clientX - self.canvas.offsetLeft;
        var y = e.clientY - self.canvas.offsetTop;

        self.ctx.putImageData(self.wrap,0,0);
        self.ctx.fillStyle = "rgba(56,20,60)";

        self.ctx.beginPath();
        self.ctx.moveTo(self.dX, self.dY);
        self.ctx.strokeRect(self.dX, self.dY,(x-self.dX),(y-self.dY));
        self.ctx.closePath();
        self.ctx.drawImage(self.img, self.dX, self.dY,(x-self.dX),(y-self.dY), self.dX,self.dY,(x-self.dX),(y-self.dY));
    }
}

没写兼容,细节也不完善,没时间先放着

posted @ 2013-11-13 14:14  风之约  阅读(457)  评论(0编辑  收藏  举报