用javascript实现图像裁剪
画布标记只有两个属性:宽度和高度,用于设置画布的宽度和高度。如果不是由标签属性或脚本设置,则默认值为300×150。
那么,画布的引入在这里首先。让我们用画布查看Javascript的裁剪代码。
复制代码代码如下所示:
无功selectobj = null;
功能imagecrop(canvasid,图像源,X,Y,宽度,高度){
VaR的画布=美元(# + canvasid);
如果(canvas.length图像源= = 0){
返回;
}
功能canvasmousedown(e){
stopselect(E);
canvas.css(光标
}
功能canvasmousemove(e){
无功canvasoffset = canvas.offset();
无功pagex = e.pagex事件。targettouches { 0 }。pagex | |;
无功pagey = e.pagey事件。targettouches { 0 }。pagey | |;
imousex = math.floor(pagex - canvasoffset。左);
imousey = math.floor(pagey - canvasoffset。顶);
canvas.css(光标
如果(selectobj。bdragall){
canvas.css(光标
canvas.data(拖
VaR CX = imousex - selectObj.px;
CX = 00;
MX = ctx.canvas.width - selectobj。W;
;
SelectObj。x = cx;
VaR CY = imousey - selectObj.py;
赛扬= 00:赛扬;
我ctx.canvas.height selectobj H = -;
赛扬;
SelectObj。Y = CY;
}
对于(var i = 0;i < 4;i + +){
SelectObj。男{我} = false;
SelectObj。icsize {我} = selectobj.csize;
}
在多维数据集上调整大小
如果(imousex > selectobj。X selectobj.csizeh imousex < selectobj X + selectobj.csizeh。
imousey > selectobj。Y selectobj.csizeh imousey < selectobj。Y + selectobj。csizeh){
canvas.css(光标
SelectObj。男{ 0 } =真;
SelectObj。icsize { 0 } = selectobj.csizeh;
}
如果(imousex > selectobj。x + selectobj。W·selectObj.csizeh iMouseX << selectobj。X + W + selectobj.csizeh selectobj。
imousey > selectobj。Y selectobj.csizeh imousey < selectobj。Y + selectobj。csizeh){
canvas.css(光标
SelectObj。男{ 1 } =真;
SelectObj。icsize { 1 } = selectobj.csizeh;
}
如果(imousex > selectobj。x + selectobj。W·selectObj.csizeh iMouseX << selectobj。X + W + selectobj.csizeh selectobj。
imousey > selectobj。Y + selectobj。H selectobj.csizeh imousey < selectobj。Y + selectobj。H + selectobj。csizeh){
canvas.css(光标
SelectObj。男{ 2 } =真;
SelectObj。icsize { 2 } = selectobj.csizeh;
}
如果(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(光标
SelectObj。男{ 3 } =真;
SelectObj。icsize { 3 } = selectobj.csizeh;
}
如果(imousex > selectobj。X imousex selectobj。Y imousey < selectobj。Y + selectobj。h){
canvas.css(光标
}
在拖动调整大小的情况下
VaR的IFW,IFH,IFX,IFY,MX,我;
如果(selectobj。bdrag { 0 }){
IFX = imousex - selectObj.px;
IFY = imousey - selectObj.py;
IFW = selectobj。W + selectobj X IFX;
投资= selectobj。H + selectobj Y动词;
canvas.data(拖
}
如果(selectobj。bdrag { 1 }){
IFX = selectobj X;
IFY = imousey - selectObj.py;
IFW = imousex - selectobj.px - IFX;
投资= selectobj。H + selectobj Y动词;
canvas.data(拖
}
如果(selectobj。bdrag { 2 }){
IFX = selectobj X;
如果selectobj Y =;
IFW = iMouseX - selectObj.px - iFX;
投资= imousey - selectobj.py动词;
canvas.data(拖
}
如果(selectobj。bdrag { 3 }){
IFX = imousex - selectObj.px;
如果selectobj Y =;
IFW = selectobj。W + selectobj X IFX;
投资= imousey - selectobj.py动词;
canvas.data(拖
}
如果(IFW > > selectobj.csizeh正常selectobj.csizeh * 2 * 2){
SelectObj。W = IFW;
SelectObj H =正常;
SelectObj。x = IFX;
SelectObj。Y = IFY;
}
DrawScene();
}
功能canvasmouseout(){
$(帆布)。Trigger(MouseUp );
}
功能canvasmouseup(){
selectobj.bdragall = false;
对于(var i = 0;i < 4;i + +){
SelectObj。bdrag {我} = false;
}
canvas.css(光标
canvas.data(选择
X:selectobj X,
Y:selectobj。Y,
女:selectobj。W,
H:selectobj。H
});
selectobj.px = 0;
selectobj.py = 0;
}
函数选择(x,y,w,h){
这个。
这个,y = y;
这个。
这个;
this.px = x; / /额外的变量来牵引计算
this.py = Y;
this.csize = 4; / /调整立方体的大小
this.csizeh = 6; / /调整立方体的大小(悬停)
this.bhow = {假,假,假,假}; / /悬停状态
this.icsize = { this.csize,this.csize,this.csize,这。csize }; / /调整大小的立方体
this.bdrag = {假,假,假,假}; / /拖状态
this.bdragall = false; / /拖整个选择
}
(Selection.prototype.draw函数){
ctx.strokestyle =666#;
ctx.linewidth = 2;
Ctx.strokeRect(这个X,Y,W,这,这,H);
原始图像的一部分
如果(这0,这个,H = 0){
ctx.drawimage(图像,这个X,Y,W,这,这,这,这,X,Y,W,这,这,H);
}
调整立方体大小
ctx.fillstyle =999#;
Ctx.fillRect(的X,icsize { 0 },这,这,icsize { 0 },这。icsize { 0 }×2,这个icsize { 0 }×2);
Ctx.fillRect(,X,W,icsize { 1 },这,这,icsize { 1 },这。icsize { 1 }×2,这个icsize { 1 }×2);
Ctx.fillRect(,X,W,icsize { 2 },这。Y +,H本。icsize { 2 },这。icsize { 2 }×2,这个icsize { 2 }×2);
Ctx.fillRect(的X,icsize { 3 },这。Y +,H本。icsize { 3 },这。icsize { 3 }×2,这个icsize { 3 }×2);
};
VaR DrawScene(){()=功能
ctx.clearrect(0, 0,ctx.canvas.width,CTX。帆布。高度); / /清除画布
源图像
ctx.drawimage(形象,0, 0,ctx.canvas.width,CTX。帆布。高度);
使它变暗
ctx.fillstyle = 'rgba(0, 0, 0,0.5);
ctx.fillrect(0, 0,ctx.canvas.width,CTX。帆布。高度);
绘制/选择
SelectObj.draw();
Canvas.mousedown (canvasMouseDown);
canvas.on(touchstart
};
无功createselection =函数(x,y,宽度,高度){
无功量=美元(# imagepreview );
X = X(math.ceil | |(内容。宽度)-(宽) / 2);
Y = y(math.ceil | |(含量高)-(高度)/ 2);
返回新的选择(x,y,宽度,高度);
};
VaR CTX =帆布{ 0 }。getContext(2D);
无功imousex = 1;
无功imousey = 1;
新图像();
image.onload =函数(){
selectobj = createselection(x,y,宽度,高度);
canvas.data(选择
X:selectobj X,
Y:selectobj。Y,
女:selectobj。W,
H:selectobj。H
});
DrawScene();
};
image.src =图像源;
Canvas.mousemove(canvasmousemove);
canvas.on(touchmove
无功stopselect =功能(e){
无功canvasoffset = $(帆布)偏移();
无功pagex = e.pagex事件。targettouches { 0 }。pagex | |;
无功pagey = e.pagey事件。targettouches { 0 }。pagey | |;
imousex = math.floor(pagex - canvasoffset。左);
imousey = math.floor(pagey - canvasoffset。顶);
selectobj.px = imousex - selectobj X;
selectobj.py = imousey - selectobj。Y;
如果(selectobj。男{ 0 }){
selectobj.px = imousex - selectobj X;
selectobj.py = imousey - selectobj。Y;
}
如果(selectobj。男{ 1 }){
selectobj.px = imousex - selectobj。X selectobj。W;
selectobj.py = imousey - selectobj。Y;
}
如果(selectobj。男{ 2 }){
selectobj.px = imousex - selectobj。X selectobj。W;
selectobj.py = imousey - selectobj。Y selectobj。H;
}
如果(selectobj。男{ 3 }){
selectobj.px = imousex - selectobj X;
selectobj.py = imousey - selectobj。Y selectobj。H;
}
如果(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 =真;
}
对于(var i = 0;i < 4;i + +){
如果(selectobj。男{我}){
SelectObj bdrag { } =真实的我;
}
}
};
canvas.mouseout(canvasmouseout);
Canvas.mouseup(canvasmouseup);
canvas.on(touchend
this.getimagedata =功能(previewid){
无功tmpcanvas = $(){ 0 };
无功tmpctx = tmpcanvas.getcontext(2D);
如果(tmpcanvas selectobj){
tmpcanvas.width = selectobj。W;
tmpcanvas.height = selectobj。H;
tmpctx.drawimage(图像,selectobj。X,Y,selectobj。selectobj。W,selectobj。H,0, 0,selectobj selectobj。W。H);
如果(document.getelementbyid(previewid)){
document.getelementbyid(previewid)。src= tmpcanvas.todataurl();
document.getelementbyid(previewid)。style.border =1px solid # CCC;
}
返回tmpcanvas.todataurl();
}
};
}
功能autoresizeimage(最大,最大高度,objimg){
VaR img =新的图像();
img.src = objimg.src;
无功hratio;
无功wratio;
var比率= 1;
无功W = objimg.width;
var H = objimg.height;
wratio =最大 / W;
hratio =最大高度 / H;
如果(W<maxwidth h<最大高度){
返回;
}
如果(最大= = 0 {最大高度= = 0)
比率=1;
} {如果其他(最大= 0)
如果(hratio<1){
比= hratio;
}
} {如果其他(最大高度= 0)
如果(wratio<1){
比= wratio;
}
如果(wratio < 1 } { | | hratio<1)
比=(wratio <= hratio wratio:hratio);
{人}
比=(wratio <= hratio wratio hratio)- math.floor(wratio <= hratio wratio:hratio);
}
如果(比例为1){
如果(比< 0.5 W<maxwidth h<最大高度){
比率=1比;
}
w=w比;
h=h比;
}
objimg.height = H;
objimg.width = W;
}
让我们试一下,希望大家能喜欢,让我留言。