Вы можете использовать context.clip()
нарисовать изображение, которое обрезается внутри прямоугольника с закругленными углами
Сначала нарисуйте прямоугольник с закругленными углами (не нужно погладить или заполнить):
// draw a rounded rectangle
ctx.beginPath();
ctx.moveTo(x + radius, y);
ctx.lineTo(x + width - radius, y);
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
ctx.lineTo(x + width, y + height - radius);
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
ctx.lineTo(x + radius, y + height);
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
ctx.lineTo(x, y + radius);
ctx.quadraticCurveTo(x, y, x + radius, y);
ctx.closePath();
Затем вызовите context.clip, который заставит все будущие рисунки должны быть обрезаны внутри прямоугольника
ctx.clip();
Наконец, нарисуйте изображение внутри этого прямоугольника, и ваше изображение будет обрезано.
ctx.drawImage(img,10,10,102,77);
Вот пример код и Фидл: http://jsfiddle.net/m1erickson/FLaee/
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
#canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var img=new Image();
img.onload=function(){
ctx.save();
roundedImage(10,10,102,77,10);
ctx.clip();
ctx.drawImage(img,10,10,102,77);
ctx.restore();
}
img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/sky-bg2.jpg";
function roundedImage(x,y,width,height,radius){
ctx.beginPath();
ctx.moveTo(x + radius, y);
ctx.lineTo(x + width - radius, y);
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
ctx.lineTo(x + width, y + height - radius);
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
ctx.lineTo(x + radius, y + height);
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
ctx.lineTo(x, y + radius);
ctx.quadraticCurveTo(x, y, x + radius, y);
ctx.closePath();
}
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=300 height=300></canvas>
</body>
</html>
Спасибо! Вероятно, это решило бы мою проблему, но на данный момент я создал скрипт для покрытия с нуля (я думал, что это было проще, поэтому я сделал это). – tbutcaru
Возможно, я ошибаюсь, но я не могу отключить клип. Как это должно работать? –
@SephReed Да, «Un-clipping» не так очевидно, как могло бы быть. Оберните 'ctx.clip' betweem' ctx.save' и 'ctx.restore'. «Сохранить» сохранит предварительные свойства незакрепленного контекста, и восстановление будет «un-clip», восстановив эти предварительные свойства. – markE