我该如何在圆形内绘制一张图片?如果我这样做:
context.beginPath();
context.arc((e.pageX),(e.pageY),161,0,Math.PI*2,true);
context.closePath();
怎样使用fill()方法将绘制的图像填充到画布上?前几天我为我正在制作的一个大项目做了这件事;
var thumbImg = document.createElement('img');
thumbImg.src = 'path_to_image';
thumbImg.onload = function() {
tmpCtx.save();
tmpCtx.beginPath();
tmpCtx.arc(25, 25, 25, 0, Math.PI * 2, true);
tmpCtx.closePath();
tmpCtx.clip();
tmpCtx.drawImage(thumbImg, 0, 0, 50, 50);
tmpCtx.beginPath();
tmpCtx.arc(0, 0, 25, 0, Math.PI * 2, true);
tmpCtx.clip();
tmpCtx.closePath();
tmpCtx.restore();
};
对我来说完美地工作了。
这是我制作的更复杂版本,还包括图像缓存:https://jsfiddle.net/jaredwilli/ex5n5/
不确定您是否仍在寻找答案,但以下是方法:
var ctx = document.getElementById('your_canvas').getContext("2d");
//ctx.lineWidth = 13;
//ctx.strokeStyle = 'rgba(0,0,0,1)';
//ctx.fillStyle="rgba(0,0,0,0)" // if using this, make sure alpha < 1
ctx.arc(100,100, 50, 0, Math.PI*2,true); // you can use any shape
ctx.clip();
var img = new Image();
img.addEventListener('load', function(e) {
ctx.drawImage(this, 0, 0, 200, 300);
//ctx.fill();
//ctx.stroke();
}, true);
img.src="/path/to/image.jpg";
你也可以使用pattern来实现这个,但是会失去一些图片摆放的灵活性。
ctx.arc(100,100, 70, 0, Math.PI*2,true);
ctx.clip();
img = new Image()
img.addEventListener('load', function(e) {
ctx.fillStyle = ctx.createPattern(this, 'no-repeat')
ctx.fill();
}, true);
img.src="/path/to/image.jpg"
使用带有CSS的<img>
来实现border-radius
:http://jsfiddle.net/ChrisMorgan/BQGxA/
使用SVG而不是<canvas>
,并将椭圆形设置为图像的剪切路径(更复杂的剪切路径也很容易实现)
我不知道您的要求和情况,所以不确定这些是否能满足您的需求,但我认为值得考虑。对于许多情况,<canvas>
并不是解决所有问题的方案 - 在这些情况下,普通HTML中的CSS和/或SVG可能更加匹配。
//set-up - probably only needs to be done once
var scratchCanvas = document.createElement('canvas');
scratchCanvas.width = 100;
scratchCanvas.height = 100;
var scratchCtx = scratchCanvas.getContext('2d');
//drawing code
scratchCtx.clearRect(0, 0, scratchCanvas.width, scratchCanvas.height);
scratchCtx.globalCompositeOperation = 'source-over'; //default
//Do whatever drawing you want. In your case, draw your image.
scratchCtx.drawImage(imageToCrop, ...);
//As long as we can represent our clipping region as a single path,
//we can perform our clipping by using a non-default composite operation.
//You can think of destination-in as "write alpha". It will not touch
//the color channel of the canvas, but will replace the alpha channel.
//(Actually, it will multiply the already drawn alpha with the alpha
//currently being drawn - meaning that things look good where two anti-
//aliased pixels overlap.)
//
//If you can't represent the clipping region as a single path, you can
//always draw your clip shape into yet another scratch canvas.
scratchCtx.fillStyle = '#fff'; //color doesn't matter, but we want full opacity
scratchCtx.globalCompositeOperation = 'destination-in';
scratchCtx.beginPath();
scratchCtx.arc(50, 50, 50, 0, 2 * Math.PI, true);
scratchCtx.closePath();
scratchCtx.fill();
//Now that we have a nice, cropped image, we can draw it in our
//actual canvas. We can even draw it over top existing pixels, and
//everything will look great!
ctx.drawImage(scratchCanves, ...);
onload
回调之后再设置src
。也就是说,thumbImg.src = 'path_to_image';
应该成为最后一行。 - Raul Pinto