使用动态模式从 JSON 加载

2024-03-29

我正在尝试保存 Fabric.js 画布并使用重新加载它loadFromJson。 但我收到错误:patternSourceCanvas 未定义。 我认为我应该将其设为全局,所以我删除了 var。 但是,当我用新图案填充其他新形状时,这个新图案将应用于画布上所有先前绘制的具有旧图案的形状。 请帮助我设计动态模式。

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <title>Dynamic patterns | Fabric.js Demos</title>




    <!--[if lt IE 9]>
      <script src="../lib/excanvas.js"></script>
    <![endif]-->

    <!-- <script src="base/prism.js"></script> -->
    <script src="http://fabricjs.com/lib/fabric.js"></script>
  </head>
  <body>





    <div id="bd-wrapper">
      <h2><span>Fabric.js demos</span>Dynamic patterns</h2>



<div>
  <p>
    <label>Repeat pattern?</label>
    <input type="checkbox" id="img-repeat" checked>
  </p>
  <p>
    <label>Pattern image width</label>
    <input type="range" min="50" max="1000" value="100" id="img-width">
  </p>
  <p>
    <label>Pattern left offset</label>
    <input type="range" min="0" max="500" value="0" id="img-offset-x">
  </p>
  <p>
    <label>Pattern top offset</label>
    <input type="range" min="0" max="500" value="0" id="img-offset-y">
  </p>
  <br>
  <p>
    <label>Pattern image angle</label>
    <input type="range" min="-90" max="90" value="0" id="img-angle">
  </p>
  <p>
    <label>Pattern image padding</label>
    <input type="range" min="-50" max="50" value="0" id="img-padding">
  </p>

</div>
<div><button id="toJson">TOJSON</button></div>
<div><button id="fromJson">LoadFromJSON</button></div>
<canvas id="c" width="500" height="500" style="border:1px solid #ccc"></canvas>
<script>






var canvas = new fabric.Canvas('c');
var padding = 0;

fabric.Image.fromURL('http://fabricjs.com/assets/pug.jpg', function(img) {

  img.scaleToWidth(100).set({
    originX: 'left',
    originY: 'top'
  });

  var patternSourceCanvas = new fabric.StaticCanvas();
  patternSourceCanvas.add(img);

  var pattern = new fabric.Pattern({
    source: function() {
      patternSourceCanvas.setDimensions({
        width: img.getWidth() + padding,
        height: img.getHeight() + padding
      });
      return patternSourceCanvas.getElement();
    },
    repeat: 'repeat'
  });

  canvas.add(new fabric.Polygon([
    {x: 185, y: 0},
    {x: 250, y: 100},
    {x: 385, y: 170},
    {x: 0, y: 245} ], {
      left: 220,
      top: 200,
      angle: -30,
      fill: pattern
    }));




  document.getElementById('img-width').onchange = function() {
    img.scaleToWidth(parseInt(this.value, 10));
    canvas.renderAll();
  };
  document.getElementById('img-angle').onchange = function() {
    img.setAngle(this.value);
    canvas.renderAll();
  };
  document.getElementById('img-padding').onchange = function() {
    padding = parseInt(this.value, 10);
    canvas.renderAll();
  };
  document.getElementById('img-offset-x').onchange = function() {
    pattern.offsetX = parseInt(this.value, 10);
    canvas.renderAll();
  };
  document.getElementById('img-offset-y').onchange = function() {
    pattern.offsetY = parseInt(this.value, 10);
    canvas.renderAll();
  };
  document.getElementById('img-repeat').onclick = function() {
    pattern.repeat = this.checked ? 'repeat' : 'no-repeat';
    canvas.renderAll();
  };
});
document.getElementById('toJson').onclick = function () {
    jsonData = JSON.stringify(canvas);
}
document.getElementById('fromJson').onclick = function () {
    canvas.clear();
    canvas.loadFromJSON(jsonData);
    canvas.renderAll();

}

</script>


</body>
</html>

这可能是有史以来最新的答案,但我想我也可以回答它,因为这是在谷歌上搜索这个问题时的第一个点击,而且我也有这个确切的问题。

问题是源函数被序列化为代码,例如:

"fill":{
            "source":"function () {\r\n\t                    patternSourceCanvas.setDimensions({\r\n\t                        width: img.getWidth(),\r\n\t                        height: img.getHeight(),\r\n\t                    });\r\n\t                    return patternSourceCanvas.getElement();\r\n\t                }",
            "repeat":"repeat",
            "offsetX":0,
            "offsetY":0
         },

到目前为止,解决此问题的最佳方法是创建自己的对象来扩展所需的形状,并覆盖 toObject() 和初始化函数。这将允许您保存和加载所需的自定义数据。

大概是这样的:http://jsfiddle.net/Ly9YY/ http://jsfiddle.net/Ly9YY/(该特定代码似乎不起作用)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用动态模式从 JSON 加载 的相关文章

随机推荐

  • Java内存不足错误(本机内存),达到进程大小限制(32位linux)

    我正在测试 Web 应用程序的性能 并收到 内存不足错误 本机内存 我测试了好几次 每次都是 无法为 Chunk new 分配 83886088 字节 并死掉 我每分钟打印一次内存大小 发现进程死亡前VmSize为2924700 kB 我认
  • 在Python中读取.dss数据库文件

    我有一个 DSS 数据库文件 我想使用 Python 从该文件中提取数据库架构 我实际上需要对此数据库执行查询 但我找不到任何好的文档来开始 所以 我决定如果我可以提取模式 我可以创建一个 SQLite 数据库并在那里运行我的实验 文件内容
  • Web API 2 返回 OK 响应但继续在后台处理

    我已经为 shopify 创建了一个 mvc web api 2 webhook public class ShopifyController ApiController PUT api Afilliate SaveOrder Respon
  • 单击外部时防止日期选择器关闭[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 jquery datepicker 我想在单击日历对话框外部时阻止关闭功能 url http jqueryui com dat
  • 禁用下拉菜单中的选项 Unity

    I need to disable 1 or 2 dropdown option from a dropdown menu in Unity The dropdown menu should not be repopulated There
  • R、正确使用粘贴功能

    该循环正确创建了 13 个名为 bond1 bond13 的 df 并为它们分配了 function1 中的值 现在我需要使用 function2 和另外两个 df 创建另外 13 个名为 spread1 spread13 的 DF 其中之
  • 如何使用 PHP 检测访问我们网站的用户的 MAC 地址?

    我知道如何追踪 IP 地址 但我需要追踪查看我的页面的用户的 MAC 地址 如何做到这一点 除非用户与网络服务器位于同一 LAN 上 否则无法执行此操作 MAC 地址位于 TCP IP 下面的以太网层 并且不包含在从用户本地网络路由出去的
  • 为什么 SQL Server 2008 在长事务 INSERT 上阻止 SELECT?

    我们正在尝试建立一个只定期插入新记录的事务表 这个简单的表需要我们随着时间的推移不断向其中添加新记录 该表中的事务量预计会相当高 并且可能会定期批量导入事务 gt 1000 这可能需要几秒钟才能完成 然后 我们根据这些数据执行一组选择语句
  • 你能在 vim 中做交互式宏或录音吗?

    我想定义一个 vim 宏 在特定时间中断用户输入 这可能吗 编辑 原来是我的录音 q 而不是宏 可以在录音中使用输入命令 但麻烦大于其价值 我首先将插入输入转义映射到一个键 map
  • Visual Studio Code:如何同时打开调试窗口和资源管理器窗口?

    我是视觉代码新手 我有一个小问题 您有两个用红线圈出的按钮 第一个按钮打开资源管理器窗口 第二个圆圈按钮打开调试窗口 我想打开这两个窗口 你知道该怎么做吗 从 VSCode 1 13 开始这是不可能的 已跟踪显示多个面板的功能请求here
  • 使用TDD在Java中开发文件遍历代码

    我必须实现一些代码来遍历目录结构并返回找到的文件列表 要求非常简单 给定一个基本目录 查找其中的所有文件 不是目录本身 如果找到目录 请重复步骤 1 我想使用 TDD 开发代码 当我开始编写测试时 我意识到我在嘲笑班级File 这样我就可以
  • PHP 致命错误:内存不足(已分配 80740352)(试图分配 12352 字节)

    当用户在我的网站上上传图像时 我收到此错误 错误消息是 PHP 致命错误 home 内存不足 已分配 80740352 试图分配 12352 字节 如何使用 php ini 修复此问题 这是我当前的上传 php ini 设置 upload
  • 对 .toolbarBackground SwiftUI 使用渐变

    我正在尝试为导航 toolbarBackground 设置自定义渐变 但任何时候我都只使用 LinearGradient 中的第一种颜色运行它 toolbar ToolbarItem placement navigationBarTrail
  • 在 React Native 地图中设置最大和最小缩放级别

    如何在 React Native 地图中设置最小和最大缩放级别
  • 如何从 EditText 中仅获取可见文本

    我有一个用于在 Android 上运行的代码编辑器的 EditText 我正在对内容应用语法突出显示 除了 EditText 滚动到屏幕之外的大字符串之外 它运行良好 每次按键时语法突出显示都会应用于整个 Spannable 有谁知道我如何
  • 核心数据实体唯一约束不起作用

    我正在尝试使用新的实体约束检查器在核心数据中设置约束 以使项目的名称唯一 我读过的所有内容都表明这非常简单 设置约束并处理错误 我没有收到任何错误 并且可以根据需要多次添加相同的条目 该应用程序确实需要 IOS 9 0 Xcode 工具要求
  • 在 VSTS 上调用 Pull Request API 时收到“403 Forbidden”

    对于我调用的其他 API 包括 Analytics 一切似乎都工作正常 但是当我尝试进行任何拉取请求查询时 我得到一个403 Forbidden 这些呼叫是由我的私人 Windows 代理进行的 其 PAT 已获得所有范围的授权 它正在使用
  • 如何四舍五入到最接近的十? [复制]

    这个问题在这里已经有答案了 如何在没有 if 语句的情况下将数字四舍五入到最接近的十 例如 98 到 100 int num 87 double t double d 1 0 num d 87 0 t d 100 System out pr
  • 有没有比加0.5f并截断转换更直接的方法将float转换为int并进行舍入?

    在处理浮点数据的 C 代码中 从 float 到 int 的舍入转换相当频繁 例如 一种用途是生成转换表 考虑一下这段代码 Convert a positive float value and round to the nearest in
  • 使用动态模式从 JSON 加载

    我正在尝试保存 Fabric js 画布并使用重新加载它loadFromJson 但我收到错误 patternSourceCanvas 未定义 我认为我应该将其设为全局 所以我删除了 var 但是 当我用新图案填充其他新形状时 这个新图案将