我正在尝试使用 Fabric JS 创建一种效果,其中字母看起来像这样在毛衣上“刺绣”:
我可以通过使用这个动作在 Photoshop 中实现这个效果。
我把它变成 a 的想法<canvas>
是从 Photoshop 中渲染出每个刺绣字母的 png。然后,我将根据用户键入的内容将每个字母放在画布上。
然而,这种方法不会有正确的字距调整。
为了解决这个问题,我尝试使用相同的字体在 Fabric 中写出文本,然后将每个刺绣 png 覆盖在它要替换的字母之上(然后隐藏文本本身)。
这是我呈现文本的方式:
window.chest_text = new fabric.IText("NYC", {
fill: '#000',
fontSize: 12,
left: 210,
top: 100,
fontFamily: 'Graphik',
fontWeight: 500,
lineHeight: 1,
originX: 'center',
});
然后是我渲染刺绣字母的方法:
var n_url = 'https://res.cloudinary.com/tricot/image/upload/v1598820746/tmp/n-embroidery-test.png'
var y_url = 'https://res.cloudinary.com/tricot/image/upload/v1598820745/tmp/y-embroidery-test.png'
var c_url = 'https://res.cloudinary.com/tricot/image/upload/v1598820745/tmp/c-embroidery-test.png'
fabric.Image.fromURL(n_url, function(img) {
img.set({
left: Math.round(window.chest_text.aCoords.bl.x),
top: window.chest_text.top
})
img.scaleToHeight(Math.floor(window.chest_text.__charBounds[0][0].height / 1.13), true)
canvas.add(img);
})
fabric.Image.fromURL(y_url, function(img) {
img.set({
left: Math.round(window.chest_text.aCoords.bl.x + window.chest_text.__charBounds[0][1].left),
top: window.chest_text.top
})
img.scaleToHeight(Math.floor(window.chest_text.__charBounds[0][1].height / 1.13), true)
canvas.add(img);
})
fabric.Image.fromURL(c_url, function(img) {
img.set({
left: Math.round(window.chest_text.aCoords.bl.x + window.chest_text.__charBounds[0][2].left),
top: window.chest_text.top
})
img.scaleToHeight(Math.floor(window.chest_text.__charBounds[0][2].height / 1.13), true)
canvas.add(img);
})
window.chest_text.opacity = 0.5
window.canvas.renderAll()
但是,我无法让刺绣字母完全覆盖常规文本(即使它是相同的字体):
我怎样才能做到这一点?有没有更好的方法让字距调整正常工作?