Node.js中将Emoji转换为PNG或JPG格式 - 如何实现?

8
为了我正在工作的项目,我需要从表情符号(最好是苹果表情符号)生成图像文件。我认为这应该是一件相当简单的事情,但是每个我使用的工具,最终都遇到了障碍。
我还考虑过使用表情符号集,例如这个,我可以在需要时进行查询。不幸的是,我链接的那个没有Unicode 9.0表情符号,例如鳄梨()、虾()或哈拉姆贝()。您是否知道这样一个最新的集合?
就代码而言,我尝试过opentype.js,但它不支持.ttc字体,这是我Mac上表情符号字体的扩展名(Apple Color Emoji.ttc)。我已将字体转换为.ttf,但也没有成功:
  var opentype = require('opentype.js');
  opentype.load('./build_scripts/apple_color_emoji.ttf', function (err, font) {
      if (err) {
          alert('Could not load font: ' + err);
      } else {
          console.log("loaded the font",font);

          var Canvas = require('canvas')
            , Image = Canvas.Image
            , canvas = new Canvas(200, 200)
            , ctx = canvas.getContext('2d');
          var path = font.getPath('', 0, 150, 72);
          path.draw(ctx);
          console.log('<img src="' + canvas.toDataURL() + '" />');
      }
  });

结果如下所示:

结果如下所示:

我尝试过fontkit,它应该能够读取.ttc文件,但是如果我尝试使用Apple Color Emoji字体,它会抛出一个错误。
  var fontkit = require('fontkit');
  var font = fontkit.openSync('./build_scripts/Apple Color Emoji.ttc'); 
  // TypeError: font.layout is not a function

如果我使用转换后的.ttf文件尝试相同操作,可能会得到一些不正确的SVG:

  var fontkit = require('fontkit');
  var font = fontkit.openSync('./build_scripts/apple_color_emoji.ttf');
  var run = font.layout('');
  var svg = run.glyphs[0].path.toSVG();

  console.log(svg);
  // M-1 0ZM799 800Z

我的问题是,我是否采用了正确的方法?将我已经拥有的表情符号转换为.png或其他格式似乎应该是相当简单的事情,但我就是无法让它工作。

编辑:

我在这个仓库中找到了一个表情符号名称和十六进制代码的列表(向rodrigopolo致以最大的敬意)。现在我可以简单地使用这个:

var emoji = "".codePointAt(0).toString(16); //1f60a
var emojiFile = fs.readFileSync('./my-emoji-folder/' + emoji + '.png');

不过,如果有人有编码解决方案,那就太好了!

进一步编辑:

结果发现我找到的第一个解决方案只包括 Unicode 8.0 版本以前的表情符号,而不是 Unicode 9.0。我找到了一个 Ruby gem gemoji 可以提取表情符号。如果您不是 Ruby 开发人员(我不是),您可以在 Shell 中使用以下命令:

git clone https://github.com/github/gemoji.git
cd gemoji
bundle install
bundle exec gemoji extract some-directory/emoji

现在,您的some-directory/emoji文件夹中拥有Unicode 9.0表情符号!


这似乎是一个非常神秘的问题 (+1)。出于好奇,你为什么需要用表情符号创建图像? - Dragomok
1
哈哈,是啊,可能这就是我找解决方案时遇到困难的原因。我正在尝试一个React项目,通过使用不同的.env文件来构建网站的外观。我已经决定将网站图标设置为表情符号,所以我需要一种方法根据.env中指定的表情符号动态生成它们。但对于更日常的用途,您可以使用它来在不支持表情符号的设备上显示最新的表情符号。 - user2634633
1
谁说Fontkit支持TTC了?因为它绝对不支持。将你的TTC解压成实际字体文件,然后使用这些文件来生成图像。另外,如果你找到了解决方案,不要将其添加为“编辑”,而是写一个答案,然后一天后接受它。没有答案的问题只会被遗忘,而不是被Google索引。 - Mike 'Pomax' Kamermans
他们的文档上看起来确实是这样的:https://github.com/devongovett/fontkit - user2634633
它如何与谷歌索引配合工作?我不接受自己的答案,因为我仍在寻找一个非hacky的解决方案。 - user2634633
显示剩余2条评论
1个回答

5

通过从字体集合中选择字体,我能够使用fontkit使其工作。 我还没有发现使用“Apple Color Emoji.ttc”中包含的任何TTF都会产生不同的结果。

const fs = require('fs');
const fontkit = require('fontkit');
const emoji = require('node-emoji');
const font = fontkit.openSync('./Apple Color Emoji.ttc').fonts[0];

let emo = emoji.get('100');
let run = font.layout(emo);
let glyph = run.glyphs[0].getImageForSize(128)

fs.writeFileSync('100.png', glyph.data);

1
正是我所需要的!出于简单起见,我只会删除 node-emoji 依赖项:let run = font.layout('');. - user2634633
另外,要记住的一件事是 getImageForSize 函数以像素为单位获取表情符号图像,而苹果彩色表情符号的最大尺寸似乎是160。 - thebenmiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接