最近做了一个好玩的东西,分享给大家。
bendImage.png有一个需求,就是要把图片两侧裁剪成向内凹的圆形(如图),并且两侧凹处不能遮挡背景。
预览地址:http://www.dyrily.cn/bendImage/
对于这种异形的图片,css貌似有点棘手。于是乎,祭出神器:canvas。
这个需求的难点在于如何让裁剪的圆弧通过固定的点,也就是图片边角。
img2.png这里用的方法是勾股定理来计算裁剪圆的半径。
/**
* @param canvas element元素
* @param option
* width canvas的宽
* height canvas的高
* url 裁剪图片的链接
* distance 内凹的距离
*/
function bendImage(canvas, option) {
canvas.width = option.width;
canvas.height = option.height;
var ctx = canvas.getContext('2d');
// 通过勾股定理化简后的表达式
var radius = (option.distance + Math.pow(option.height, 2) / option.distance / 4) / 2;
var image;
if (bendImage.image && bendImage.image.src === option.url) {
image = bendImage.image;
draw();
return;
}
image = new Image();
image.src = option.url;
image.onload = function () {
bendImage.image = image;
draw();
};
function draw() {
ctx.drawImage(image, 0, 0, option.width, option.height);
ctx.globalCompositeOperation = 'destination-out';
ctx.arc(option.distance - radius, option.height / 2, radius, 0, Math.PI * 2);
ctx.fill();
ctx.arc(option.width + radius - option.distance, option.height / 2, radius, 0, Math.PI * 2);
ctx.fill();
}
}
原创文章,转载注明出处,感谢。
网友评论