手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >使用JavaScript+canvas实现图片裁剪
使用JavaScript+canvas实现图片裁剪
摘要:canvas是一个可以让我们使用脚本绘图的标签,它提供了一系列完整的属性和方法。我们可以借此来实现图形绘制,图像处理甚至实现简单的动画和游戏...

canvas是一个可以让我们使用脚本绘图的标签,它提供了一系列完整的属性和方法。我们可以借此来实现图形绘制,图像处理甚至实现简单的动画和游戏制作。

canvas标签只有两个属性:width和height,用来设定画布的宽和高,如果没有通过标签属性或者脚本来设置,默认为300*150;

好了,canvas的介绍就先到这里,下面我们来看看javascript结合canvas实现图片的裁剪代码:

复制代码 代码如下:

var selectObj = null;

function ImageCrop(canvasId, imageSource, x, y, width, height) {

var canvas = $("#" + canvasId);

if (canvas.length == 0 && imageSource) {

return;

}

function canvasMouseDown(e) {

StopSelect(e);

canvas.css("cursor", "default");

}

function canvasMouseMove(e) {

var canvasOffset = canvas.offset();

var pageX = e.pageX || event.targetTouches[0].pageX;

var pageY = e.pageY || event.targetTouches[0].pageY;

iMouseX = Math.floor(pageX - canvasOffset.left);

iMouseY = Math.floor(pageY - canvasOffset.top);

canvas.css("cursor", "default");

if (selectObj.bDragAll) {

canvas.css("cursor", "move");

canvas.data("drag", true);

var cx = iMouseX - selectObj.px;

cx = cx < 0 ? 0 : cx;

mx = ctx.canvas.width - selectObj.w;

cx = cx > mx ? mx : cx;

selectObj.x = cx;

var cy = iMouseY - selectObj.py;

cy = cy < 0 ? 0 : cy;

my = ctx.canvas.height - selectObj.h;

cy = cy > my ? my : cy;

selectObj.y = cy;

}

for (var i = 0; i < 4; i++) {

selectObj.bHow[i] = false;

selectObj.iCSize[i] = selectObj.csize;

}

// hovering over resize cubes

if (iMouseX > selectObj.x - selectObj.csizeh && iMouseX < selectObj.x + selectObj.csizeh &&

iMouseY > selectObj.y - selectObj.csizeh && iMouseY < selectObj.y + selectObj.csizeh) {

canvas.css("cursor", "pointer");

selectObj.bHow[0] = true;

selectObj.iCSize[0] = selectObj.csizeh;

}

if (iMouseX > selectObj.x + selectObj.w - selectObj.csizeh && iMouseX < selectObj.x + selectObj.w + selectObj.csizeh &&

iMouseY > selectObj.y - selectObj.csizeh && iMouseY < selectObj.y + selectObj.csizeh) {

canvas.css("cursor", "pointer");

selectObj.bHow[1] = true;

selectObj.iCSize[1] = selectObj.csizeh;

}

if (iMouseX > selectObj.x + selectObj.w - selectObj.csizeh && iMouseX < selectObj.x + selectObj.w + selectObj.csizeh &&

iMouseY > selectObj.y + selectObj.h - selectObj.csizeh && iMouseY < selectObj.y + selectObj.h + selectObj.csizeh) {

canvas.css("cursor", "pointer");

selectObj.bHow[2] = true;

selectObj.iCSize[2] = selectObj.csizeh;

}

if (iMouseX > selectObj.x - selectObj.csizeh && iMouseX < selectObj.x + selectObj.csizeh &&

iMouseY > selectObj.y + selectObj.h - selectObj.csizeh && iMouseY < selectObj.y + selectObj.h + selectObj.csizeh) {

canvas.css("cursor", "pointer");

selectObj.bHow[3] = true;

selectObj.iCSize[3] = selectObj.csizeh;

}

if (iMouseX > selectObj.x && iMouseX < selectObj.x + selectObj.w && iMouseY > selectObj.y && iMouseY < selectObj.y + selectObj.h) {

canvas.css("cursor", "move");

}

// in case of dragging of resize cubes

var iFW, iFH, iFX, iFY, mx, my;

if (selectObj.bDrag[0]) {

iFX = iMouseX - selectObj.px;

iFY = iMouseY - selectObj.py;

iFW = selectObj.w + selectObj.x - iFX;

iFH = selectObj.h + selectObj.y - iFY;

canvas.data("drag", true);

}

if (selectObj.bDrag[1]) {

iFX = selectObj.x;

iFY = iMouseY - selectObj.py;

iFW = iMouseX - selectObj.px - iFX;

iFH = selectObj.h + selectObj.y - iFY;

canvas.data("drag", true);

}

if (selectObj.bDrag[2]) {

iFX = selectObj.x;

iFY = selectObj.y;

iFW = iMouseX - selectObj.px - iFX;

iFH = iMouseY - selectObj.py - iFY;

canvas.data("drag", true);

}

if (selectObj.bDrag[3]) {

iFX = iMouseX - selectObj.px;

iFY = selectObj.y;

iFW = selectObj.w + selectObj.x - iFX;

iFH = iMouseY - selectObj.py - iFY;

canvas.data("drag", true);

}

if (iFW > selectObj.csizeh * 2 && iFH > selectObj.csizeh * 2) {

selectObj.w = iFW;

selectObj.h = iFH;

selectObj.x = iFX;

selectObj.y = iFY;

}

drawScene();

}

function canvasMouseOut() {

$(canvas).trigger("mouseup");

}

function canvasMouseUp() {

selectObj.bDragAll = false;

for (var i = 0; i < 4; i++) {

selectObj.bDrag[i] = false;

}

canvas.css("cursor", "default");

canvas.data("select", {

x: selectObj.x,

y: selectObj.y,

w: selectObj.w,

h: selectObj.h

});

selectObj.px = 0;

selectObj.py = 0;

}

function Selection(x, y, w, h) {

this.x = x; // initial positions

this.y = y;

this.w = w; // and size

this.h = h;

this.px = x; // extra variables to dragging calculations

this.py = y;

this.csize = 4; // resize cubes size

this.csizeh = 6; // resize cubes size (on hover)

this.bHow = [false, false, false, false]; // hover statuses

this.iCSize = [this.csize, this.csize, this.csize, this.csize]; // resize cubes sizes

this.bDrag = [false, false, false, false]; // drag statuses

this.bDragAll = false; // drag whole selection

}

Selection.prototype.draw = function () {

ctx.strokeStyle = '#666';

ctx.lineWidth = 2;

ctx.strokeRect(this.x, this.y, this.w, this.h);

// draw part of original image

if (this.w > 0 && this.h > 0) {

ctx.drawImage(image, this.x, this.y, this.w, this.h, this.x, this.y, this.w, this.h);

}

// draw resize cubes

ctx.fillStyle = '#999';

ctx.fillRect(this.x - this.iCSize[0], this.y - this.iCSize[0], this.iCSize[0] * 2, this.iCSize[0] * 2);

ctx.fillRect(this.x + this.w - this.iCSize[1], this.y - this.iCSize[1], this.iCSize[1] * 2, this.iCSize[1] * 2);

ctx.fillRect(this.x + this.w - this.iCSize[2], this.y + this.h - this.iCSize[2], this.iCSize[2] * 2, this.iCSize[2] * 2);

ctx.fillRect(this.x - this.iCSize[3], this.y + this.h - this.iCSize[3], this.iCSize[3] * 2, this.iCSize[3] * 2);

};

var drawScene = function () {

ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); // clear canvas

// draw source image

ctx.drawImage(image, 0, 0, ctx.canvas.width, ctx.canvas.height);

// and make it darker

ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';

ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);

// draw selection

selectObj.draw();

canvas.mousedown(canvasMouseDown);

canvas.on("touchstart", canvasMouseDown);

};

var createSelection = function (x, y, width, height) {

var content = $("#imagePreview");

x = x || Math.ceil((content.width() - width) / 2);

y = y || Math.ceil((content.height() - height) / 2);

return new Selection(x, y, width, height);

};

var ctx = canvas[0].getContext("2d");

var iMouseX = 1;

var iMouseY = 1;

var image = new Image();

image.onload = function () {

selectObj = createSelection(x, y, width, height);

canvas.data("select", {

x: selectObj.x,

y: selectObj.y,

w: selectObj.w,

h: selectObj.h

});

drawScene();

};

image.src = imageSource;

canvas.mousemove(canvasMouseMove);

canvas.on("touchmove", canvasMouseMove);

var StopSelect = function (e) {

var canvasOffset = $(canvas).offset();

var pageX = e.pageX || event.targetTouches[0].pageX;

var pageY = e.pageY || event.targetTouches[0].pageY;

iMouseX = Math.floor(pageX - canvasOffset.left);

iMouseY = Math.floor(pageY - canvasOffset.top);

selectObj.px = iMouseX - selectObj.x;

selectObj.py = iMouseY - selectObj.y;

if (selectObj.bHow[0]) {

selectObj.px = iMouseX - selectObj.x;

selectObj.py = iMouseY - selectObj.y;

}

if (selectObj.bHow[1]) {

selectObj.px = iMouseX - selectObj.x - selectObj.w;

selectObj.py = iMouseY - selectObj.y;

}

if (selectObj.bHow[2]) {

selectObj.px = iMouseX - selectObj.x - selectObj.w;

selectObj.py = iMouseY - selectObj.y - selectObj.h;

}

if (selectObj.bHow[3]) {

selectObj.px = iMouseX - selectObj.x;

selectObj.py = iMouseY - selectObj.y - selectObj.h;

}

if (iMouseX > selectObj.x + selectObj.csizeh &&

iMouseX < selectObj.x + selectObj.w - selectObj.csizeh &&

iMouseY > selectObj.y + selectObj.csizeh &&

iMouseY < selectObj.y + selectObj.h - selectObj.csizeh) {

selectObj.bDragAll = true;

}

for (var i = 0; i < 4; i++) {

if (selectObj.bHow[i]) {

selectObj.bDrag[i] = true;

}

}

};

canvas.mouseout(canvasMouseOut);

canvas.mouseup(canvasMouseUp);

canvas.on("touchend", canvasMouseUp);

this.getImageData = function (previewID) {

var tmpCanvas = $("<canvas></canvas>")[0];

var tmpCtx = tmpCanvas.getContext("2d");

if (tmpCanvas && selectObj) {

tmpCanvas.width = selectObj.w;

tmpCanvas.height = selectObj.h;

tmpCtx.drawImage(image, selectObj.x, selectObj.y, selectObj.w, selectObj.h, 0, 0, selectObj.w, selectObj.h);

if (document.getElementById(previewID)) {

document.getElementById(previewID).src = tmpCanvas.toDataURL();

document.getElementById(previewID).style.border = "1px solid #ccc";

}

return tmpCanvas.toDataURL();

}

};

}

function autoResizeImage(maxWidth, maxHeight, objImg) {

var img = new Image();

img.src = objImg.src;

var hRatio;

var wRatio;

var ratio = 1;

var w = objImg.width;

var h = objImg.height;

wRatio = maxWidth / w;

hRatio = maxHeight / h;

if (w < maxWidth && h < maxHeight) {

return;

}

if (maxWidth == 0 && maxHeight == 0) {

ratio = 1;

} else if (maxWidth == 0) {

if (hRatio < 1) {

ratio = hRatio;

}

} else if (maxHeight == 0) {

if (wRatio < 1) {

ratio = wRatio;

}

} else if (wRatio < 1 || hRatio < 1) {

ratio = (wRatio <= hRatio ? wRatio : hRatio);

} else {

ratio = (wRatio <= hRatio ? wRatio : hRatio) - Math.floor(wRatio <= hRatio ? wRatio : hRatio);

}

if (ratio < 1) {

if (ratio < 0.5 && w < maxWidth && h < maxHeight) {

ratio = 1 - ratio;

}

w = w * ratio;

h = h * ratio;

}

objImg.height = h;

objImg.width = w;

}

小伙伴们拿去试试吧,希望大家能够喜欢,有疑问就给我留言吧。

【使用JavaScript+canvas实现图片裁剪】相关文章:

奇妙的Javascript图片放大镜

JavaScript实现自动变换表格边框颜色

javascript实现日期按月份加减

JavaScript Array对象详解

Javascript实现广告页面的定时关闭

JavaScript实现Iterator模式实例分析

javascript实现简单的进度条

JavaScript Date对象详解

JavaScript实现列表分页功能特效

javascript实现表格增删改操作实例详解

精品推荐
分类导航