我正在尝试将文本写入图像并与JIMP一起包裹文本,但目前文本在图像上的一行上溢出。我关注文档,但我的文档不起作用。这是我的代码:
let image = {};
return Jimp.read('app/background.png')
.then(imageResponse => {
// Image is 500 x 500
image = imageResponse
return Jimp.loadFont(Jimp.FONT_SANS_64_BLACK);
})
.then(font => {
return image.print(font, margin, margin, 'Very Long Hello WOrld Text', 200)
})
.then(image => {
return image.writeAsync(`app/new-${(new Date()/1000)}.png`);
})
有点迟到以回答这个问题,但是我想出了自己的逻辑来包装JIMP Image内的文本。
下面的代码将创建一系列字符串,其长度小于允许的限制。
因此我们可以根据图像宽度更改限制。
let message = "Some very large text which will not fit in one line, lets try fitting this in multiple lines";
let x = 10;
let y = 10;
let stringArr = message.split(' ');
let finalArr = [];
let strLengthBefore = 0, strLengthAfter = 0;
let limitLength = 30;
let tempStr = '';
for (let i = 0; i < stringArr.length; i++) {
strLengthAfter = strLengthBefore + stringArr[i].length + 1;
if (strLengthAfter >= limitLength) {
finalArr.push(tempStr);
tempStr = '';
strLengthBefore = 0, strLengthAfter = 0;
i = i - 1;
} else {
tempStr += stringArr[i] + ' ';
strLengthBefore += stringArr[i].length;
if (i == stringArr.length - 1) {
finalArr.push(tempStr);
break;
}
}
}
现在只需循环绕过数组,并在图像上打印文本。
let font = await Jimp.loadFont(path.join(base_path, 'montserrat_bold_italic.fnt'));
y = 200;
for (let i = 0; i < finalArr.length; i++) {
image.print(font,
10,
y,
{
text: finalArr[i],
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
// alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE
},
560,
800
);
y += 30;
}
希望这会有所帮助。