我编写了一个脚本,它采用这样的图像(通常黑色是 alpha):
...并添加您想要的任何颜色的边框:
然而它不是很快。将边框层创建为这个小字体的画布大约需要 130 毫秒。更大的字体需要更长的时间!
逻辑很简单:
/* This is more or less psuedo-code. */
// Blank image data where I will put the border.
var newData = newContext.getImageData(0, 0, canvas.width, canvas.height);
// The image I will be analyzing.
var oldData = oldContext.getImageData(0, 0, this.data.width, this.data.height);
// Loop through every pixel in oldData and remember where non-alpha pixels are.
var fontPixels = this._getNonAlphaPixels(oldData);
// Loop through relevant pixels, remember neighboring pixels, and add border.
for (var px in fontPixels) {
for (var py in fontPixels[px]) {
var borderPixels = this._getBorderPixels(px, py);
for (var bx in borderPixels) {
for (var by in borderPixels[bx]) {
if (typeof fontPixels[bx] !== 'undefined' &&
typeof fontPixels[bx][by] !== 'undefined')
{
continue; // Do not draw borders inside of font.
}
newData.data[((newData.width * by) + bx) * 4] = color.red;
newData.data[((newData.width * by) + bx) * 4 + 1] = color.green;
newData.data[((newData.width * by) + bx) * 4 + 2] = color.blue;
newData.data[((newData.width * by) + bx) * 4 + 3] = 255; //alpha
}
}
}
}
基本上我想知道:有人知道不需要逐像素操作的替代方法吗?或者也许可以对上述逻辑进行重大优化?
我应该提到_getNonAlphaPixels
' 的执行时间可以忽略不计。而_getBorderPixels
的执行时间仅为总时间的 17%。
编辑
以下选择的答案非常有效。我的解决方案与下面的解决方案之间的唯一显着区别是,每当绘制文本时,我都会绘制图像而不是(而不是字体)。
谢谢肯。