CanvasRenderingContext2D翻转变换
CanvasRenderingContext2D flip transformation
我找到了 this CanvasRenderingContext2D 并用它玩了一下。我能够使用此上下文缩放和旋转我的图像:
crop: function () {
var canvas = document.createElement("canvas");
var context = canvas.getContext("2d");
canvas.width = this.options.width / this.scale;
canvas.height = this.options.height / this.scale;
var currWidth = this.imgWidth * this.scale;
var currHeight = this.imgHeight * this.scale;
var correctX = (currWidth - this.imgWidth) / 2;
var correctY = (currHeight - this.imgHeight) / 2;
var sourceX = (this.posX - correctX) / this.scale;
var sourceY = (this.posY - correctY) / this.scale;
context.translate(sourceX, sourceY);
context.translate(this.imgWidth / 2, this.imgHeight / 2);
context.rotate(this.rotate * Math.PI / 180);
context.drawImage(this.imgFull, this.imgWidth / 2 * -1, this.imgHeight / 2 * -1);
this.options.modal.remove();
this.promise.resolve(canvas);
},
不幸的是,我找不到任何垂直或水平翻转 canvas 的功能。在代码中,我认为我可以做类似的事情:
if(self.flipV) {
context.rotateY(180);
}
if(self.flipH) {
context.rotateX(180);
}
但我找不到任何在 y 轴或 x 轴上旋转的方法。
有什么方法可以在这里进行翻转转换吗?
我不知道这是否是您要找的,但您可以使用 CSS 反映图像。我的一个项目中有这个:
<style>
.image-reflect {
transform: scaleX(-1);
}
</style>
.
.
.
<span class="fa fa-share-alt image-reflect"></span>
将 FontAwesome share icon 显示为 "merge" 图标。
实际上,如果您查找"CSS transform",您会发现它可以旋转、缩放、移动、倾斜等
虽然不明显,但是可以用context.scale
的方法翻转。
使用 context.scale(-1,1)
水平翻转,使用 context.scale(1,-1)
垂直翻转。
就像旋转一样,您必须在执行 context.scale 之前使用 context.translate
设置旋转点。
这是示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var img=new Image();
img.onload=start;
img.src="https://dl.dropboxusercontent.com/u/139992952/multple/marioRunningRight.png";
function start(){
// original
ctx.drawImage(img,200,200);
// horizontal flip
ctx.translate(200,0);
ctx.scale(-1,1);
ctx.drawImage(img,0,200);
ctx.setTransform(1,0,0,1,0,0);
// vertical flip
ctx.translate(0,200);
ctx.scale(1,-1);
ctx.drawImage(img,200,0);
ctx.setTransform(1,0,0,1,0,0);
// labels
ctx.font='18px verdana';
ctx.textAlign='center';
ctx.fillText('Original',275,375);
ctx.fillText('scale(-1,1)',125,375);
ctx.fillText('Horizontal Flip',125,395);
ctx.fillText('scale(1,-1)',275,20);
ctx.fillText('Vertical Flip',275,40);
}
<canvas id="canvas" width=400 height=425></canvas>
通过 CanvasRenderingContext2D 镜像图像
这是一个简单的实用函数,可以水平、垂直或同时镜像图像。
function mirrorImage(ctx, image, x = 0, y = 0, horizontal = false, vertical = false){
ctx.save(); // save the current canvas state
ctx.setTransform(
horizontal ? -1 : 1, 0, // set the direction of x axis
0, vertical ? -1 : 1, // set the direction of y axis
x + horizontal ? image.width : 0, // set the x origin
y + vertical ? image.height : 0 // set the y origin
);
ctx.drawImage(image,0,0);
ctx.restore(); // restore the state as it was when this function was called
}
用法
mirrorImage(ctx, image, 0, 0, true, false); // horizontal mirror
mirrorImage(ctx, image, 0, 0, false, true); // vertical mirror
mirrorImage(ctx, image, 0, 0, true, true); // horizontal and vertical mirror
更多镜子
如果您希望能够沿任意线进行镜像,请参阅答案
我找到了 this CanvasRenderingContext2D 并用它玩了一下。我能够使用此上下文缩放和旋转我的图像:
crop: function () {
var canvas = document.createElement("canvas");
var context = canvas.getContext("2d");
canvas.width = this.options.width / this.scale;
canvas.height = this.options.height / this.scale;
var currWidth = this.imgWidth * this.scale;
var currHeight = this.imgHeight * this.scale;
var correctX = (currWidth - this.imgWidth) / 2;
var correctY = (currHeight - this.imgHeight) / 2;
var sourceX = (this.posX - correctX) / this.scale;
var sourceY = (this.posY - correctY) / this.scale;
context.translate(sourceX, sourceY);
context.translate(this.imgWidth / 2, this.imgHeight / 2);
context.rotate(this.rotate * Math.PI / 180);
context.drawImage(this.imgFull, this.imgWidth / 2 * -1, this.imgHeight / 2 * -1);
this.options.modal.remove();
this.promise.resolve(canvas);
},
不幸的是,我找不到任何垂直或水平翻转 canvas 的功能。在代码中,我认为我可以做类似的事情:
if(self.flipV) {
context.rotateY(180);
}
if(self.flipH) {
context.rotateX(180);
}
但我找不到任何在 y 轴或 x 轴上旋转的方法。 有什么方法可以在这里进行翻转转换吗?
我不知道这是否是您要找的,但您可以使用 CSS 反映图像。我的一个项目中有这个:
<style>
.image-reflect {
transform: scaleX(-1);
}
</style>
.
.
.
<span class="fa fa-share-alt image-reflect"></span>
将 FontAwesome share icon 显示为 "merge" 图标。
实际上,如果您查找"CSS transform",您会发现它可以旋转、缩放、移动、倾斜等
虽然不明显,但是可以用context.scale
的方法翻转。
使用 context.scale(-1,1)
水平翻转,使用 context.scale(1,-1)
垂直翻转。
就像旋转一样,您必须在执行 context.scale 之前使用 context.translate
设置旋转点。
这是示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var img=new Image();
img.onload=start;
img.src="https://dl.dropboxusercontent.com/u/139992952/multple/marioRunningRight.png";
function start(){
// original
ctx.drawImage(img,200,200);
// horizontal flip
ctx.translate(200,0);
ctx.scale(-1,1);
ctx.drawImage(img,0,200);
ctx.setTransform(1,0,0,1,0,0);
// vertical flip
ctx.translate(0,200);
ctx.scale(1,-1);
ctx.drawImage(img,200,0);
ctx.setTransform(1,0,0,1,0,0);
// labels
ctx.font='18px verdana';
ctx.textAlign='center';
ctx.fillText('Original',275,375);
ctx.fillText('scale(-1,1)',125,375);
ctx.fillText('Horizontal Flip',125,395);
ctx.fillText('scale(1,-1)',275,20);
ctx.fillText('Vertical Flip',275,40);
}
<canvas id="canvas" width=400 height=425></canvas>
通过 CanvasRenderingContext2D 镜像图像
这是一个简单的实用函数,可以水平、垂直或同时镜像图像。
function mirrorImage(ctx, image, x = 0, y = 0, horizontal = false, vertical = false){
ctx.save(); // save the current canvas state
ctx.setTransform(
horizontal ? -1 : 1, 0, // set the direction of x axis
0, vertical ? -1 : 1, // set the direction of y axis
x + horizontal ? image.width : 0, // set the x origin
y + vertical ? image.height : 0 // set the y origin
);
ctx.drawImage(image,0,0);
ctx.restore(); // restore the state as it was when this function was called
}
用法
mirrorImage(ctx, image, 0, 0, true, false); // horizontal mirror
mirrorImage(ctx, image, 0, 0, false, true); // vertical mirror
mirrorImage(ctx, image, 0, 0, true, true); // horizontal and vertical mirror
更多镜子
如果您希望能够沿任意线进行镜像,请参阅答案