背景
项目中有一个编辑上传用户头像的功能,之前选用了cropper插件来处理编辑图片的功能,现在还想做到类似QQ等选取圆形图像的功能,考虑结合cropper来处理。
方案
- 样式上通过CSS来控制cropper选取框为圆形
.cropper-view-box, .cropper-face {
border-radius: 50%;
}
- 处理图片时通过canvas来实现
function getRoundedCanvas(){
var crop=(...).data("cropper"); //获取crop对象
var sourceCanvas=crop.getCroppedCanvas();
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var width = sourceCanvas.width;
var height = sourceCanvas.height;
canvas.width = width;
canvas.height = height;
context.imageSmoothingEnabled = true;
context.drawImage(sourceCanvas, 0, 0, width, height);
context.globalCompositeOperation = 'destination-in';
context.beginPath();
context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true);
context.fill();
return canvas;
}
其它注意点
需要注意的是,如果通过toDataUrl方式转图片时,在格式为jpg的情况下,得到的圆图的底色可能会变成黑色,这是因为在转jpg的过程中,原先的透明度属性会丢失,这里我是通过统一设置图片转换格式为png格式来解决的。
var dataurl=canvas.toDataURL("image/png");
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
var filename=(...);
var f=new File([u8arr],filename,{type:"image/png"});
查阅文档的传送门
1.fengyuanchen/cropperjs · GitHub
2.cropperjs
3.canvas参考手册
csdn地址
版权申明
此文章版权为本人所有,非经本人许可禁止复制转载。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。