在 Fabric js 中缩放时保持描边宽度

2024-03-16

注:我已参考所以问题 https://stackoverflow.com/questions/39548747/fabricjs-how-to-scale-object-but-keep-the-border-stroke-width-fixed,但这对我的情况没有用,因为

1)我试图保持以前的边界,但到目前为止它在缩放时重新计算边界。

我添加了以下代码以在缩放对象时停止自动增加边框。现在的问题是我已经向对象添加了 5px 边框,但是当缩放对象时,它不会保留我之前添加的边框。

canvas.on('object:scaling', (e) => {
  var o = e.target;
  if (!o.strokeWidthUnscaled && o.strokeWidth) {
    o.strokeWidthUnscaled = o.strokeWidth;
  }

  if (o.strokeWidthUnscaled) {
    o.strokeWidth = o.strokeWidthUnscaled / o.scaleX;
  }
});

现在我想要的是在缩放对象时防止边框增加。边界应保持原样。

这是片段/Codepen https://codepen.io/dhavalsisodiya/pen/JpeMBP

var canvas = new fabric.Canvas('canvas1');

$('.add_shape').click(function() {
  var cur_value = $(this).attr('data-rel');
  if (cur_value != '') {
    switch (cur_value) {
      case 'rectangle':
        var rect = new fabric.Rect({
          left: 50,
          top: 50,
          fill: '#aaa',
          width: 50,
          height: 50,
          opacity: 1,
          stroke: '#000',
          strokeWidth: 1
        });
        canvas.add(rect);
        canvas.setActiveObject(rect);
        break;
      case 'circle':
        var circle = new fabric.Circle({
          left: 50,
          top: 50,
          fill: '#aaa',
          radius: 50,
          opacity: 1,
          stroke: '#000',
          strokeWidth: 1
        });
        canvas.add(circle);
        canvas.setActiveObject(circle);
        break;
    }
  }
});

canvas.on('object:scaling', (e) => {
  var o = e.target;
  if (!o.strokeWidthUnscaled && o.strokeWidth) {
    o.strokeWidthUnscaled = o.strokeWidth;
  }
  if (o.strokeWidthUnscaled) {
    o.strokeWidth = o.strokeWidthUnscaled / o.scaleX;
  }
});

/* Control the border  */
$('#control_border').change(function() {
  var cur_value = parseInt($(this).val());
  var activeObj = canvas.getActiveObject();
  if (activeObj == undefined) {
    alert('Please select the Object');
    return false;
  }
  activeObj.set({
    strokeWidth: cur_value
  });
  canvas.renderAll();
});
button {
  max-resolution: 10px;
  height: 30px;
}

div {
  margin: 10px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.0.0-beta.7/fabric.js"></script>

<div>
  <button class="add_shape" data-rel="circle">Add Circle</button>

  <button class="add_shape" data-rel="rectangle">Add Rectangle</button>

  <label class="control-label">Border</label>
  <input id="control_border" type="range" min="0" max="10" step="1" value="0" />
</div>

<canvas id="canvas1" width="600" height="300" style="border:1px solid #000000;"></canvas>

Steps

1) 添加矩形
2)应用边框(比方说5)
3)缩放该对象

现在您可以看到应用的边框消失了。那么如何解决呢?

Update

我尝试过下面的选项,但它不起作用,基本上我正在尝试维护矩形、圆形、三角形、直线、多边形等对象的描边宽度/边框

到目前为止我已经尝试过:

//1st try
canvas.on('object:scaling', (e) => {
    var o = e.target;
    o.strokeWidth = o.strokeWidth / ((o.scaleX + o.scaleY) / 2);
    var activeObject = canvas.getActiveObject();
    activeObject.set('strokeWidth',o.strokeWidth);
});

//2nd try
canvas.on('object:scaling', (e) => {
    if (!o.strokeWidthUnscaled && o.strokeWidth) {
        o.strokeWidthUnscaled = o.strokeWidth;
    }
    if (o.strokeWidthUnscaled) {
        o.strokeWidth = o.strokeWidthUnscaled / o.scaleX;
    }
});

//3rd try
fabric.Object.prototype._renderStroke = function(ctx) {
    if (!this.stroke || this.strokeWidth === 0) {
        return;
    }
    if (this.shadow && !this.shadow.affectStroke) {
        this._removeShadow(ctx);
    }
    ctx.save();
    ctx.scale(1 / this.scaleX, 1 / this.scaleY);
    this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke);
    this._applyPatternGradientTransform(ctx, this.stroke);
    ctx.stroke();
    ctx.restore();
};

我参考过的问题:

https://github.com/kangax/fabric.js/issues/66 https://github.com/kangax/fabric.js/issues/66

如果 Fabricjs 中存在组,则在调整大小时无法保持描边宽度的厚度 https://stackoverflow.com/questions/34265823/unable-to-maintain-thickness-of-strokewidth-while-resizing-in-case-of-groups-in/

Fabricjs 如何缩放对象但保持边框(描边)宽度固定 https://stackoverflow.com/questions/39548747/fabricjs-how-to-scale-object-but-keep-the-border-stroke-width-fixed/

调整 Fabricjs 矩形的大小以保持边框大小 https://stackoverflow.com/questions/46878814/resize-a-fabricjs-rect-to-maintain-border-size/46931792

https://github.com/kangax/fabric.js/issues/2012 https://github.com/kangax/fabric.js/issues/2012

但无法找到解决方案。


从 Fabric.js 版本 2.7.0 开始,这变得更加容易。现在有一个strokeUniform属性,启用后可防止笔划宽度受到对象比例值的影响。

obj.set('strokeUniform', true);

https://github.com/fabricjs/fabric.js/pull/5546 https://github.com/fabricjs/fabric.js/pull/5546

var canvas = new fabric.Canvas('canvas1');

$('.add_shape').click(function() {
  var cur_value = $(this).attr('data-rel');
  if (cur_value != '') {
    switch (cur_value) {
      case 'rectangle':
        var rect = new fabric.Rect({
          left: 50,
          top: 50,
          fill: '#aaa',
          width: 50,
          height: 50,
          opacity: 1,
          stroke: '#000',
          strokeWidth: 1,
          noScaleCache: false,
          strokeUniform: true,
        });
        canvas.add(rect);
        canvas.setActiveObject(rect);
        break;
      case 'circle':
        var circle = new fabric.Circle({
          left: 50,
          top: 50,
          fill: '#aaa',
          radius: 50,
          opacity: 1,
          stroke: '#000',
          strokeWidth: 1,
          noScaleCache: false,
          strokeUniform: true
        });
        canvas.add(circle);
        canvas.setActiveObject(circle);
        break;
    }
  }
});

/* Control the border  */
$('#control_border').change(function() {
  var cur_value = parseInt($(this).val());
  var activeObj = canvas.getActiveObject();
  if (activeObj == undefined) {
    alert('Please select the Object');
    return false;
  }
  activeObj.set({
    strokeWidth: cur_value
  });
  canvas.renderAll();
});
button {
  max-resolution: 10px;
  height: 30px;
}

div {
  margin: 10px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.7.0/fabric.min.js"></script>

<div>
  <button class="add_shape" data-rel="circle">Add Circle</button>
  <button class="add_shape" data-rel="rectangle">Add Rectangle</button>
  <label class="control-label">Border</label>
  <input id="control_border" type="range" min="0" max="10" step="1" value="0" />
</div>

<canvas id="canvas1" width="600" height="300" style="border:1px solid #000000;"></canvas>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Fabric js 中缩放时保持描边宽度 的相关文章

  • zone.js:140未捕获类型错误:无法读取属性“删除”

    我是 kendo ui 的新手 我在小提琴中开发了原型 删除确认窗口在那里工作正常 但是当我集成到我的代码库中时 我收到错误 Cannot read property remove at the line pai to delete rem
  • Flex、AngularJS + Masonry、akoenig/angular-deckgrid 等 [重复]

    这个问题在这里已经有答案了 我一直在发送此电子邮件 我即将发布一个用于 Web 应用程序安全的应用程序 它需要使用像 Masonry 这样的网格 我已经尝试过所有的 每一个角度模块 指令和不同的方法 包括基于 CSS 的技术 纯 Vanil
  • 节点遗留 url.parse 已弃用,用什么代替?

    require url parse someurl com page 已被仅弃用 并且我们严格的 linter 对此不满意 我尝试用互联网建议的内容替换我们的代码中的它new URL someurl com page 在大多数情况下都有效
  • jQuery JSONP ajax,未设置身份验证标头

    我正在尝试使用以下设置向 google 联系人 API 发出 ajax 请求 ajax url https www opensocial googleusercontent com api people me all dataType js
  • 如何动态删除嵌套的json键?

    这是示例 json search facets author language value nep count 3 value urd count 1 source value West Bengal State Council of Vo
  • querySelector 搜索直接子级[重复]

    这个问题在这里已经有答案了 我有一些类似 jquery 的函数 function elem return gt someselector elem 问题是我怎样才能做同样的事情querySelector 问题是 gt 选择器中querySe
  • 玉石压痕错误

    因此 对于我的 Express 网站 我使用 jade 所以我决定尝试修改我的布局文件 以便我可以开始设计我的网站 我修改了原始布局代码 有效 但我开始在任何扩展布局的文件中出现缩进错误 如下所示 500 Error home kevin
  • 使用 babel env 预设时,展开运算符出现语法错误

    我正在努力 现代化 meern io 入门样板 https github com Hashnode mern starter通过替换巴别塔es2015 and stage 0预设为env 然而 似乎env预设无法识别以下片段client m
  • 解释一下这个令人困惑的 dojo 教程声明语法

    我正在阅读使用的语法道场的声明 http dojotoolkit org documentation tutorials 1 8 declare 用于班级创建 描述很混乱 The declare function is defined in
  • 为什么Promise中的代码会同步执行? [复制]

    这个问题在这里已经有答案了 在我的项目中 我有一个很长时间运行的操作 所以我决定将其放入Promise因为我认为这样我就可以在里面的代码继续执行其他操作Promise正在跑步 调试的时候发现外面的代码Promise仅当里面的代码执行Prom
  • 为某个时刻添加持续时间 (moment.js)

    时刻版本 2 0 0 阅读文档后 http momentjs com docs manipulating add 我认为这很简单 Chrome 控制台 var timestring1 2013 05 09T00 00 00Z var tim
  • 公开闭包内的方法

    当我们在闭包内创建一个方法时 该方法将成为该闭包的私有方法 并且在我们以某种方式公开它之前无法访问它 怎么可能暴露呢 您可以返回对它的引用 var a function var b function I m private alert go
  • 如何将焦点设置在 BootStrap 中的第一个输入字段上? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将焦点设置到独立于 id 的 HTML 表单中的第一个输入元素 https stackoverflow com questions 277544 how to set the focus to t
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • NodeJS - 将相对路径转换为绝对路径

    In my 文件系统我的工作目录在这里 C temp a b c d 在 b bb 下有文件 tmp txt C temp a b bb tmp txt 如果我想从工作目录转到该文件 我将使用以下路径 bb tmp txt 如果该文件不存在
  • 如何在数据表角度中基于 JSON 动态填充表值?

    我在用着Angular 数据表 https l lin github io angular datatables 我需要能够根据返回的数据动态创建表 换句话说 我不想指定列标题 Example json数据 id 2 city Baltim
  • WebpackError:ReferenceError:Gatsby 上未定义窗口

    我已经在互联网上进行了大量搜索 但无法解决这个问题 我正在使用 Gasby 开发静态页面 但遇到此错误 WebpackError ReferenceError window is not defined 我的线索是 这与我正在使用的引导 模
  • D3 强制布局,较大的节点聚集在中心

    我一直在修改将用于标签云的强制布局 每个标签都由一个
  • 测试 jQueryUI 是否已加载

    我正在尝试调试网站 并且我认为 jQueryUI 可能未正确加载 如何测试 jQueryUI 是否已加载 if jQuery ui UI loaded OR if typeof jQuery ui undefined UI loaded 应
  • 从json中获取所有子节点

    我有以下 json var source k 01 k 02 children k 05 k 06 children k ABC k PQR k 07 k 03 我希望能够指定 k 的值并取回所有孩子 以及孙

随机推荐

  • 如果类包含基类类型的成员作为第一个元素,然后是其他成员,编译器可以优化空基吗?

    考虑 struct empty struct child empty empty a sizeof int sizeof empty int b Assume sizeof int gt sizeof empty 标准是否强制要求sizeo
  • 使用 g++ 编译 C++11

    我正在尝试将我的 C 编译器更新到 C 11 我搜索了一下 得出的结论是我必须使用该标志 std c 0x or std gnu 0x 但我对标志了解不多 谁能帮我 我使用的是 Ubuntu 12 04 这是当我尝试使用 C 11 中包含的
  • Composer更新问题

    我正在使用 laravel composer 我正在加载 way generators 包 当我运行 Composer update 时出现以下错误 加载包含包信息的 Composer 存储库 依赖项 包括 require dev 致命错误
  • Java:为什么我不能将 int 转换为 Long

    Java 中的所有数字都应该是 int 类型 以下行在 Java gt 1 5 中是合法的 Short s 1 Will compile to Short s Short valueOf short 1 thus you can t exc
  • 使用httr R包发送POST请求

    当通过 POST 请求发送服务器数据时 我不知道如何模仿浏览器的行为 以下是相关 URL 并附有说明 1 http kenpom com 2 http kenpom com register php frompage 1
  • Xcode 4.6 上的 Mach-O 链接器错误

    我在 Xcode 4 6 上有一个 iOS 应用程序 当我最近尝试在 iPhone 6 1 模拟器中构建和运行时 我收到了 Mach O 链接器错误 它继续说道 ld 架构 i386 的 17 个重复符号 clang 错误 链接器命令失败
  • 如何使用 Roslyn 代码修复提供程序 API 从文档中删除 SyntaxNode 列表?

    我正在使用自定义生成的变量声明SyntaxFactory VariableDeclaration和一个列表SyntaxNode是根据一定条件收集的 我做了以下事情 修改节点 var newRoot root ReplaceNode expr
  • PHP显示BLOB数据?

    如何使用 PHP 显示 BLOB 数据 我已将 BLOB 输入到数据库中 但如何检索它 任何例子都会很棒 我考虑投票结束这个重复项 但标题相当不错 并且浏览其他问题 我没有找到一般问题的完整答案 这类问题暴露了对 HTTP 基础知识缺乏了解
  • 如何让Bootstrap 3工具提示跟随鼠标?

    我的网站上有一个链接列表 这些链接在 Bootstrap 工具提示中显示图像 a title Item 1 a a title Item 2 a a title Item 3 a
  • 在静态库中包含第三方库(例如:AFNetworking)

    是否可以在静态库中包含第三方库 示例 AFNetworking 可以包含在静态库中吗 您的问题的直接答案是肯定的 您绝对可以包含任何第三方库 如果它们公开公共 API 一组供您参考的标头 对于 AFNetworking 他们通过提供 Coc
  • 即使对于已登录的用户,也会在页面加载时清除 Woocommerce 购物车

    如果此页面不是购物车或结账页面 我想在页面加载时清除购物车页面即使对于登录的用户和管理员 任何页面也会被清除 这段代码可以工作 但现在不行了 Clears WC Cart on Page Load Only when not on cart
  • PDO从数据库获取数据

    我最近开始使用 PDO 之前我只使用 MySQL 现在我正在尝试从数据库中获取所有数据 getUsers DBH gt prepare SELECT FROM users ORDER BY id ASC getUsers gt fetchA
  • C# 如何最大限度地提高特定代码段没有上下文切换的机会?

    我的应用程序中有一段对时间要求严格的代码 我将运行它的线程设置为最高优先级 这是我能做的最多的事情 是否有关于如何使该线程中运行的部分代码被中断尽可能少的次数 更少发生上下文切换 的建议 代码并不复杂 我用内联代码替换了所有方法调用 并且不
  • 在 Azure API 上托管 Flask(python) API

    团队 我一直在尝试在 Azure API 应用程序上托管 Flask API 但它不起作用 Azure API 应用程序正在运行 托管页面打开 Python 版本为 3 6 6 我无法托管简单的 hello world 项目 我收到的不同错
  • 在 C# SQLCLR 中更改静态只读变量是否安全?

    我在 C 6 0 NET 3 5 CLR 程序集中编写了一些代码 安全级别 external access 减少代码 public static readonly DataTable warnings table init warnings
  • 循环 Eclipse 代码模板中的字段

    您可以在代码模板中执行循环吗 例如我想打印类中的所有字段 有这样的模板吗 假设你正在谈论Java gt Editor gt Templates参考 可能已经过时 是here http help eclipse org help32 inde
  • 在 MySQL 中存储 html 的 100% 安全方法 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP 同时使用客户端和服务器端验证,而不使用第 3 方代码

    编辑 感谢您的所有帮助 收到一封电子邮件 说我们不需要客户端 所以我放弃了这个想法 转而按时实际完成任务 在你问之前 是的 这是作业 不 我不是在寻找某人的完整代码 我是一个初学者 几乎没有 HTML PHP javascript 经验 但
  • 如何在android sqlite中显示blob数据的图像?

    我一直在尝试将 android sdcard 中的图像存储到 sqlite 数据库中 而且效果很好 图像作为 blob 存储到数据库中 这是我一直使用的粗略代码 Bitmap bitmap BitmapFactory decodeFile
  • 在 Fabric js 中缩放时保持描边宽度

    注 我已参考所以问题 https stackoverflow com questions 39548747 fabricjs how to scale object but keep the border stroke width fixe