我的目标是获得1像素宽的文本大纲。
它看起来像这样:https://jsfiddle.net/Lk1ju9yw/
我想不出一个好的方法来解决这个问题所以我做了以下(伪代码):
PImage img;
void setup() {
size(400, 400);
// use text() to write on the canvas
// initialize PImage img
// load pixels for canvas and img
// loop thru canvas pixels and look for contrast
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
// compare canvas pixels at x-y with its neighbors
// change respective pixel on PImage img so as not to disturb canvas
}
}
// update pixels and draw img over the canvas
img.updatePixels();
img(img, 0, 0);
}
简而言之,我在画布上的黑色背景上写了白色文本,进行了一些边缘检测并在PImage上绘制结果,然后使用PImage存储结果。我想我可以跳过PImage阶段,但我想看看边缘检测算法产生了什么。
所以这在获得大纲方面做得不错,但存在一些问题:
例如,如果使用ArrayList,我会沿着轮廓的每个点绘制一个椭圆,结果都可以。但是,如果我想要将椭圆间隔开,椭圆轮廓会变得粗糙。在我提供的小提琴中,字母'h'的左边缘是2像素宽。有时椭圆将在内部像素处绘制,有时在外部。这种事情让它看起来很难看。
以下是一个丑陋的示例:https://jsfiddle.net/Lk1ju9yw/1/
我很确定我明白为什么会这样。我只是不知道如何避免它。
我也相信p5.js中有一个解决方案(PFont方法)。我很乐意使用p5,但除非我必须(因为困难),我宁愿使用处理。我也听说过一些处理中的库可以帮助解决这个问题。部分地,我对结果感兴趣,但我也有兴趣学习我是否可以自己编写解决方案(有一些指导,即)。
答案 0 :(得分:0)
您可以在P5.js中轻松获得文本大纲,因为文本符合填充和描边颜色。因此,如果您拨打noFill()
,则不会填写文字,如果您拨打stroke(0)
,则文字会显示黑色。
function setup() {
createCanvas(400, 200);
noSmooth();
}
function draw() {
background(220);
textSize(72);
textAlign(CENTER);
noFill();
stroke(0);
text("hey", width/2, height/2);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.16/p5.js"></script>
不幸的是,这种方法在常规Processing中不起作用,因为它只使用文本的笔触颜色。我不完全确定Processing.js,但我的猜测与Processing相同。
如果你将它绘制到缓冲区(使用createGraphics()
),那么你可以遍历缓冲区以获得构成轮廓的点列表。
现在,至于按正确的顺序排列积分,你将不得不自己做。我遇到的第一种方法是对它们进行排序并按字母分组。
例如,您的算法可能是:
这可能并不完美,但如果你想要更高级的东西,你可能不得不开始考虑处理点列表:例如,可能删除有左邻居的点。你将不得不四处寻找你正在寻找的效果。
这是一个有趣的问题。谢谢你。祝你好运,听起来像一个有趣的项目。