Fabric.js是一个HTML5画布库,为画布提供了一个对象模型,一个SVG到画布的渲染器和一个画布到SVG的解析器。
Fabric.js / canvas 无限背景网格,如 miro
欢呼社区, 最后,我在 StackOverflow 上遇到了第一个问题,都是关于 Fabric.js 的“无限网格”——如果您对我的问题有任何反馈,请联系我! 专业...
如何以将fabricCanvas序列化到文件时保留的方式向fabric js对象添加自定义参数
我无法向 Fabric-js 对象添加自定义参数。 我创建一个圆形对象: var CircleShape = new Fabric.Circle({ 半径:100, 填充:'#eef', 比例Y:0.5, originX: '中心', 原来...
我是fabric js新手,正在尝试更改selectable的样式。 我想自定义可选。 在 CSS 之前 (https://i.stack.imgur.com/Kkrs0.png) 我把它改为 (https://i.stack.imgu...
ThreeJS 加载 GLTF 并使用 FabricJS 画布作为纹理
我正在构建一个盒子设计器工具,您可以在加载的 gltf 盒子的每个面上进行绘制。它有 10 个面,其中 5 个从顶部,5 个从底部。当我使用 BoxGeometry 时,它工作正常,但是当我发现...
Control.polygonPositionHandler 处未定义(读为“x”)
我有一个代码,可以使用 javascript 和 Fabric JS 绘制和编辑多边形。我希望它能工作成角度并尝试将其转换,但其他功能不起作用,而原始代码可以工作......
通过 JSON 加载 curveText 在 FabricJS 1.7.3 中不再起作用
我正在使用fabricjs的优秀插件“curvedText”,来自https://github.com/EffEPi/fabric.curvedText 这很好用,但是最近对 Fabricjs 的更新使该插件停止了...
Fabric.js - 为什么这个 svg 在导入到我的画布后质量这么差?
这是加载到画布上的 svg 图像。如您所知,它看起来非常像光栅图像。为了提供更多背景信息,浅蓝色框的尺寸为 1000 像素 x 400 像素。 另请注意...
我使用fabric js 进行注释。我在添加特定字体系列的文本时遇到问题。当我添加文本时,它超出了边界框,这就是为什么外部的文本是
我们在处理结构中的路径时遇到问题,当用户拖动第一个点或最后一个点时,我们需要始终更改二次线(路径)的坐标,路径会更新...
如何更改 Fabric.js 上默认的蓝色选择颜色?我尝试更改 Fabric.js 中的这些行但没有效果: 选择颜色: 'rgba(17,119,255,0.3)', 选择边框颜色:'r...
我正在开发一个网页设计项目,尝试使用 HTML、CSS 和 JavaScript 创建响应式画布元素。 但我的方法都不起作用 const canvas = new Fabric.Canvas("
我想在Fabricjs中编写一个用于边缘检测的卷积滤波器,但是矩阵不起作用。 这是矩阵(想法取自http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm): 新...
在 Fabric.js Canvas 中选择另一个对象时如何将对象保留在顶层?
我正在开发一个项目,其中使用 Fabric.js 库创建带有文本和图像的画布。我有一个要求,我想确保文本始终保留在顶层,甚至
我有一个较旧的fabric.js 项目,我想对其进行现代化改造。 在此项目中,在对象初始化期间应考虑一些用户定义的属性。 下面的例子应该...
我正在尝试将fabric.js 添加到空的Blazor 服务器端应用程序。我做了以下事情: 在_Host.cshtml中添加以下脚本 <p>我正在尝试将 <a href="http://fabricjs.com/" rel="nofollow noreferrer">fabric.js</a> 添加到空的 Blazor 服务器端应用程序。我做了以下事情:</p> <p>在<pre><code>_Host.cshtml</code></pre></p>中添加了以下脚本 <pre><code><script src="https://unpkg.com/fabric@latest/dist/fabric.js"></script> <script src="~/js/ImageEditor.js"></script> </code></pre> <p>在<pre><code>wwwroot/js</code></pre>下创建此文件:</p> <pre><code>window.fabricFunctions = { setup: function() { var canvas = new fabric.Canvas('canvasId'); // create a rect object var deleteIcon = "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='595.275px' height='595.275px' viewBox='200 215 230 470' xml:space='preserve'%3E%3Ccircle style='fill:%23F44336;' cx='299.76' cy='439.067' r='218.516'/%3E%3Cg%3E%3Crect x='267.162' y='307.978' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -222.6202 340.6915)' style='fill:white;' width='65.545' height='262.18'/%3E%3Crect x='266.988' y='308.153' transform='matrix(0.7071 0.7071 -0.7071 0.7071 398.3889 -83.3116)' style='fill:white;' width='65.544' height='262.179'/%3E%3C/g%3E%3C/svg%3E"; var img = document.createElement('img'); img.src = deleteIcon; fabric.Object.prototype.transparentCorners = false; fabric.Object.prototype.cornerColor = 'blue'; fabric.Object.prototype.cornerStyle = 'circle'; return canvas; }, add: function (canvas) { var rect = new fabric.Rect({ left: 100, top: 50, fill: 'yellow', width: 200, height: 100, objectCaching: false, stroke: 'lightgreen', strokeWidth: 4, }); canvas.add(rect); canvas.setActiveObject(rect); } }; </code></pre> <p>将以下内容放入剃刀页面中:</p> <pre><code>@page "/" @inject IJSRuntime jsRuntime; <div class="controls"> <p> <button id="add" @onclick="Add">Add a rectangle</button> </p> </div> <canvas id="canvasId" width="400" height="300" style="border:1px solid #ccc"></canvas> @code { private async Task Add() { var canvas = await jsRuntime.InvokeAsync<object>("fabricFunctions.setup"); await jsRuntime.InvokeVoidAsync("fabricFunctions.add", canvas); } } </code></pre> <p>调用 <pre><code>setup</code></pre> 后,我确实有一个 <pre><code>canvas</code></pre> 对象,我将其传递给 <pre><code>add</code></pre> 函数。但是我在调用<pre><code>canvas.add(rect)</code></pre>时遇到异常,说明add不是canvas的函数。</p> <p>是否有更好的方法来在 javascript 代码中保留 <pre><code>canvas</code></pre> 的实例,而不是在方法中传递它?</p> </question> <answer tick="false" vote="0"> <p>看这里:</p> <p><a href="https://stackoverflow.com/questions/72351350/how-to-get-js-object-and-pass-it-back">如何获取JS对象并传回?</a>.</p> <p>如果您想通过引用将对象从一个 JavaScript 函数传递到另一个 JavaScript 函数,解决方法是创建一个 JavaScript 函数来直接执行此操作,例如:</p> <pre><code>setupAndAdd: function () { var canvas = this.setup(); this.add(canvas); } </code></pre> <p><strong>Blazor 组件:</strong></p> <pre><code>private async Task Add() { await JSRuntime.InvokeVoidAsync("fabricFunctions.setupAndAdd"); } </code></pre> </answer> <answer tick="false" vote="0"> <p>您似乎面临一个问题,即传递给 <pre><code>canvas</code></pre> 函数的 <pre><code>add</code></pre> 对象未被识别为有效的 Fabric.js 画布实例。这可能是由于 JavaScript 和 Blazor 互操作的方式造成的。要解决此问题并改进代码的组织,您可以进行一些调整:</p> <p><strong>1.单独的JavaScript初始化:</strong> 将画布设置和任何其他相关初始化代码移至 <pre><code>ImageEditor.js</code></pre> 文件中。这样,您可以确保在 JavaScript 范围内正确创建和维护画布实例。</p> <p><strong>2。 Canvas 的全球范围:</strong> 不要从 <pre><code>setup</code></pre> 函数返回画布实例,而是在 JavaScript 范围内创建一个全局变量来保存画布实例。这将允许其他函数访问画布实例,而无需将其作为参数传递。</p> <p><strong>以下是修改代码的方法:</strong></p> <p>在<pre><code>ImageEditor.js:</code></pre></p> <pre><code>var canvas; // Declare a global variable to hold the canvas instance window.fabricFunctions = { setup: function() { canvas = new fabric.Canvas('canvasId'); // Other initialization code return true; // Return a flag to indicate successful setup }, add: function() { var rect = new fabric.Rect({ left: 100, top: 50, fill: 'yellow', width: 200, height: 100, objectCaching: false, stroke: 'lightgreen', strokeWidth: 4, }); canvas.add(rect); canvas.setActiveObject(rect); } }; </code></pre> <p>在您的 Blazor 组件中:</p> <pre><code>@page "/" @inject IJSRuntime jsRuntime; <div class="controls"> <p> <button id="add" @onclick="Add">Add a rectangle</button> </p> </div> <canvas id="canvasId" width="400" height="300" style="border:1px solid #ccc"></canvas> @code { private async Task Add() { var success = await jsRuntime.InvokeAsync<bool>("fabricFunctions.setup"); if (success) { await jsRuntime.InvokeVoidAsync("fabricFunctions.add"); } } } </code></pre> <p>这种方法将画布实例维护在 JavaScript 范围内,而不需要在函数之间显式传递它。请谨慎使用全局变量,因为它们可能会在更复杂的场景中导致意外行为。在这种情况下,由于您正在处理单个画布实例,因此它应该可以正常工作。</p> </answer> </body></html>
为什么选择fabricjs后top和left属性变成负数了?
在fabricjs中,画布内的所有对象都有自己的顶部和左侧属性,但是当我进行选择(使用shift+单击或拖动)时,
我在厨房水槽中使用这个 让drawCirclePath = (cx, cy, r) => { 返回 "M" + cx + "," + cy + "m" + -r + ",0a" + r + "," + r + " 0 1,0 &
我想扩展fabric.Line类以确保它始终是水平或垂直的(取决于施工期间的选项) 我通过重写 setCoords 来确保这一点, 设置坐标(){ 如果...
使用 <React.Strict Mode> 和 Fabric 的画布实例化重新渲染
我正在创建一个织物画布和按钮来实例化应该可选择的形状。我不明白为什么我的组件在以下场景中被重新渲染两次。因为这个...
Vercel Serverless Function 上的 Node-Canvas - Serverless Function 超过最大大小 50mb
在我的 Next.js 项目中,我使用 Fabric 和 Fabricjs-React 作为 Fabric 的包装器,以允许用户将图像放入我的画布中。现在fabric的依赖项之一恰好是node_modules/canvas/...