import cuowuImg from '@/assets/images/homePage/cuowu.svg' function multiselectJS(canvas) {//获取整体宽高 canvas.discardActiveObject() // 丢弃当前活动的对象和触发事件。 如果fabric作为鼠标事件的结果调用该函数,则将该事件作为参数传递给自定义事件的fire函数。 当作为一个方法使用时,参数没有任何应用。 const sel = new fabric.ActiveSelection(canvas.getObjects(), { canvas }) // console.log(sel) canvas.setActiveObject(sel) canvas.requestRenderAll() const activeObject = canvas.getActiveObject(); // 获取当前选中的整体对象 if (activeObject && activeObject.type === 'activeSelection') { const totalWidth = activeObject.width * activeObject.scaleX; const totalHeight = activeObject.height * activeObject.scaleY; return { totalWidth, totalHeight } console.log('Total Width:', totalWidth); console.log('Total Height:', totalHeight); } } function JSchangeType(canvas, val) { switch (val) { case 'init': canvas.selection = true canvas.selectionColor = 'rgba(0, 0, 0, 0.2)' canvas.selectionBorderColor = 'rgba(255, 255, 255, 0.3)' canvas.skipTargetFind = false break default: canvas.selectionColor = 'transparent' canvas.selectionBorderColor = 'transparent' canvas.skipTargetFind = true // 禁止选中 break } } //绘制直线 function JScanvasMouseDown(e, data) {//创建线 let downPoint = e.absolutePointer let currentPatterning let fill = data?.fill || 'rgba(0, 0, 0, 0.2)' let radius = data?.radius || 5 let width = data?.width || 0 let selectable = data?.selectable let strokeDashArray = data?.strokeDashArray || [0,0] switch (data.str) { case 'rect': let top = Math.min(downPoint.y) let left = Math.min(downPoint.x) // let height = Math.abs(downPoint.y - upPointer.y) // let width = Math.abs(downPoint.x - upPointer.x) currentPatterning = new fabric.Rect({ top, left, fill: fill, stroke:'#000', strokeWidth:width, strokeDashArray:strokeDashArray, rx:radius, ry:radius, selectable, }) break case 'line': currentPatterning = new fabric.Line([ downPoint.x, downPoint.y, // 起始点坐标 downPoint.x, downPoint.y // 结束点坐标 ], { stroke: fill, // 笔触颜色 strokeLineCap: 'round', strokeWidth:Number(width), } ) break case 'circle': currentPatterning = new fabric.Circle({ top: downPoint.y, left: downPoint.x, radius: 0, fill: fill, // fill: 'transparent', // stroke: fill }) break case 'triangle': currentPatterning = new fabric.Triangle({ top: downPoint.y, left: downPoint.x, width: 0, height: 0, fill: fill, // fill: 'transparent', // stroke: fill }) break case 'ellipse': currentPatterning = new fabric.Ellipse({ top: downPoint.y, left: downPoint.x, rx: 0, ry: 0, fill: fill, // fill: 'transparent', // stroke: fill }) break case 'fold': currentPatterning = new fabric.Polyline([ { x: downPoint.x, y: downPoint.y }, { x: downPoint.x, y: downPoint.y } ],{ fill: 'transparent', stroke: fill, objectCaching: false, strokeWidth:Number(width), selection:false, } ) break } return currentPatterning } async function exportSele(canvas,format){ var activeObjects = canvas.getActiveObject(); let data = { url:'', imageType:'u' } if(!activeObjects){ return } if(activeObjects.type == 'image'){ data = { url:activeObjects.getSrc(), imageType:'u', } }else{ let scale = activeObjects.scaleX? activeObjects.scaleX: 1 var exportCanvas = new fabric.Canvas(null, { width: activeObjects.width*scale, height: activeObjects.height*scale, backgroundColor: "rgba(255, 255, 255)", }); await new Promise((resolve, reject)=>{ activeObjects.clone((value)=>{ value.left = 0 value.top = 0 exportCanvas.add(value); resolve() }) }) exportCanvas.renderAll(); var imgData = exportCanvas.toDataURL({format: format,quality:1}); data = { url:imgData, imageType:'b', } exportCanvas.dispose() } return data } function JScreateCheck(e){//创建对号 let downPoint = e.absolutePointer let rect = new fabric.Rect({ width:20, height:20, fill: 'rgba(0, 0, 0, 0.2)', rx:5, ry:5, }) var path = new fabric.Path('M2 10 L8 16 L18 4', { left: 2.5, top: 2.5, stroke: 'white', strokeWidth: 2, fill:'transparent', }); var polyLineBtn = new fabric.Group([rect, path],{ top:downPoint.y-40, left:downPoint.x-10, width:20, height:20, hasControls: false, // 禁用控制点 hasBorders: false, // 禁用边框线 selectable: false, // 禁用选择功能 hoverCursor: 'pointer' }); return polyLineBtn } function JScanvasMouseMove(str,e, currentPatterning,downPoint,keyDown) { const currentPoint = e.absolutePointer let width,height,top,left,radius,rx,ry switch (str) { case 'line': currentPatterning.set('x2', currentPoint.x) currentPatterning.set('y2', currentPoint.y) break case 'rect': width = Math.abs(downPoint.x - currentPoint.x) height = Math.abs(downPoint.y - currentPoint.y) top = currentPoint.y > downPoint.y ? downPoint.y : currentPoint.y left = currentPoint.x > downPoint.x ? downPoint.x : currentPoint.x currentPatterning.set('width', width) currentPatterning.set('height', height) currentPatterning.set('top', top) currentPatterning.set('left', left) break case 'circle': radius = Math.min(Math.abs(downPoint.x - currentPoint.x), Math.abs(downPoint.y - currentPoint.y)) / 2 top = currentPoint.y > downPoint.y ? downPoint.y : downPoint.y - radius * 2 left = currentPoint.x > downPoint.x ? downPoint.x : downPoint.x - radius * 2 currentPatterning.set('radius', radius) currentPatterning.set('top', top) currentPatterning.set('left', left) break case 'triangle': width = Math.abs(downPoint.x - currentPoint.x) height = Math.abs(downPoint.y - currentPoint.y) top = currentPoint.y > downPoint.y ? downPoint.y : currentPoint.y left = currentPoint.x > downPoint.x ? downPoint.x : currentPoint.x currentPatterning.set('width', width) currentPatterning.set('height', height) currentPatterning.set('top', top) currentPatterning.set('left', left) break case 'ellipse': rx = Math.abs(downPoint.x - currentPoint.x) / 2 if(keyDown.indexOf('ShiftLeft')>-1){ ry = Math.abs(downPoint.y - currentPoint.y) / 2 if(rx > ry){ ry = rx }else{ rx = ry } }else{ ry = Math.abs(downPoint.y - currentPoint.y) / 2 } height = width top = currentPoint.y > downPoint.y ? downPoint.y : downPoint.y - ry * 2 left = currentPoint.x > downPoint.x ? downPoint.x : downPoint.x - rx * 2 currentPatterning.set('rx', rx) currentPatterning.set('ry', ry) currentPatterning.set('top', top) currentPatterning.set('left', left) break case 'fold': let points = currentPatterning.points points[points.length - 1].x = currentPoint.x points[points.length - 1].y = currentPoint.y break } } function JSRectUpdata(rect, downPointer, upPointer) { let height = (downPointer.y - upPointer.y) let width = (downPointer.x - upPointer.x) rect.set({ height, width }) return rect } async function JSSetTexture(src,){ let img await new Promise((resolve, reject) => { img = new Image img.src = src img.onload = ()=>{ img.width = 200 img.height = 200 resolve() img.remove() } }) return img } let JSSetRemoveImage = (fun)=>{ const deleteIcon = cuowuImg // 创建删除图片元素 const cornerSize = 24 let deleteImg = document.createElement('img') deleteImg.src = deleteIcon let renderIcon = (icon) => { return (ctx, left, top, styleOverride, fabricObject)=> { var size = cornerSize; ctx.save(); ctx.translate(left, top); ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); ctx.drawImage(icon, -size/3, -size/3, size/1.5, size/1.5); ctx.restore(); } } fabric.Object.prototype.controls.deleteControl = new fabric.Control({ x: 0.5, y: -0.5, offsetY: -16, offsetX: 16, cursorStyle: 'pointer', mouseUpHandler:fun, render: renderIcon(deleteImg), cornerSize: cornerSize }) } function JSSetGroup(data){ let rect if(data.gradient){ let colorStops = [] data.gradient.gradientList.forEach(item=>{ let obj = { offset:item.left.split('%')[0]/100, color:`rgba(${item.rgba.r},${item.rgba.g},${item.rgba.b},${item.rgba.a})` } colorStops.push(obj) }) let { x0, y0, x1, y1 } = calculateGradientCoordinate(100,120,data.gradient.angle) let linear = new fabric.Gradient({ type: 'linear', // 线性渐变 // coords: { x1: 0, y1: 0, x2: 200, y2: 0 }, // 渐变方向 coords: { x1:x0, y1:y0, x2:x1, y2:y1 }, // 渐变方向 colorStops: colorStops, }) var color = new fabric.Rect({ top:0, left:0, width: 110, height: 130, textAlign: "left", fill: linear // 设置渐变填充 // fill: `rgb(${data.rgbValue.r},${data.rgbValue.g},${data.rgbValue.b})`, }); var text = new fabric.Text('',{ left: 0, top: 0, fontSize: 0, fontFamily: "Arial", textAlign: "left", fill: "black", }); let text1 = new fabric.Text('',{ left: 0, top: 0, width: 20, fontSize: 0, fontFamily: "Arial", textAlign: "left", }); rect = {text,text1,color,width:110} }else{ var text = new fabric.Text(data.tcx,{ left: 0, top: 60, fontSize: 14, fontFamily: "Arial", textAlign: "left", fill: "black", }); let text1 = new fabric.Text(data.name,{ left: 0, top: 80, width: 20, fontSize: 14, fontFamily: "Arial", textAlign: "left", }); let width = 110 > text1.width ? 110 : text1.width; var color = new fabric.Rect({ width: width, height: 60, textAlign: "left", fill: `rgb(${data.rgbValue.r},${data.rgbValue.g},${data.rgbValue.b})`, }); rect = {text,text1,color,width} } return rect } function JSSetPencil(str,canvas){ let pencil if(str == 'PencilBrush'){ pencil = new fabric.PencilBrush(canvas,{}); //普通笔 }else if(str == 'Marking'){ pencil = new fabric.PencilBrush(canvas,); //记号笔 }else if(str == 'InkBrush'){ pencil = new fabric.InkBrush(canvas,{}); //油画笔 }else if(str=='CrayonBrush'){ pencil = new fabric.CrayonBrush(canvas,{}); //蜡笔 }else if(str == 'RibbonBrush'){ pencil = new fabric.RibbonBrush(canvas,{width: 1,}); //色带 }else if(str == 'MarkerBrush'){ pencil = new fabric.MarkerBrush(canvas,{}); //书写笔 // pencil = new fabric.PenBrush(canvas,{}); //书写笔 }else if(str == 'WritingBrush'){ pencil = new fabric.WritingBrush(canvas,{}); //毛笔 }else if(str == 'LongfurBrush'){ pencil = new fabric.LongfurBrush(canvas,{width: 1,}); //色带 }else if(str == 'SpraypaintBrush'){ pencil = new fabric.SpraypaintBrush(canvas,{}); //长毛刷 } return pencil } export { multiselectJS, JSRectUpdata, JSchangeType, JScanvasMouseDown, JScanvasMouseMove, JScreateCheck, exportSele, JSSetTexture, JSSetRemoveImage, JSSetGroup, JSSetPencil, }