返回介绍

Part 7:对 Text 类进行子分类以生成位图文本

发布于 2024-11-08 19:55:39 字数 2174 浏览 0 评论 0 收藏 0

本教程是针对 stackoveflow 问题而创建的,在该问题中,用户需要在 fabricJS 中使用位图而不是字体的文本对象。该代码示例包含启动子类所需了解的所有内容。当您无法通过其他 API(事件,自定义控件)获得所需的功能时,请考虑子类化是一种最后的资源。

var canvas = new fabric.Canvas(id, {
    width: 500,
    height: 500,
});
const charMap = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}'
.split('').reduce((acc, char, index) => {
  acc[char] = index + 31;
  return acc;
}, {});
class BitmapText extends fabric.Textbox {
    static type = 'BitmapText';
    static ownDefaults = {
        charWidth: 6,
        charHeight: 9,
        fontSize: 9,
        bitmap: '/article_assets/font.png',
        readyToRender: false,
    };
    static getDefaults() {
      return { ...super.getDefaults(), ...BitmapText.ownDefaults };
    }
    constructor(text, options) {
      super(text, options);
      var image = fabric.getEnv().document.createElement('img');
      image.onload = (function() {
        var canvas = fabric.getEnv().document.createElement('canvas');
        canvas.width = image.width;
        canvas.height = image.height;
        canvas.getContext('2d').drawImage(image, 0, 0);
        this.bitmapResource = canvas;
        this.readyToRender = true;
        this.dirty = true;
        if (this.canvas) this.canvas.requestRenderAll();
      }).bind(this);
      image.src = this.bitmap;
    }
    // override: make it return a fixed box 6x9
    _measureChar(_char, charStyle, previousChar, prevCharStyle) {
      return { width: 6, kernedWidth: 6 };
    }
    // ovveride, just draw the bitmpa we have.
    _renderChar(method, ctx, lineIndex, charIndex, _char, left, top) {
      if (!this.readyToRender) return;
      var res = this.bitmapResource;
      _char.split('').forEach((singleChar) => {
        ctx.drawImage(res, charMap[singleChar] * 6, 0, 5, 9, left, top - 6, 5, 9);
        ctx.translate(6, 0);
      });
    }
  }
  fabric.classRegistry.setClass(BitmapText);
  // in order for your subclass to work with loadFromJSON you have to define this Static
  // methd `fromObject`.
  var text = new BitmapText('Hello i am a bitmap text', { scaleX: 5, scaleY: 5 });    
  canvas.add(text);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文