文本只是单层填充,所以我用C++这样做:
int x,y,e;
int c0=0x00000000;
int c1=0x00FFFFFF;
int co=0x00FF0000;
int ci=0x000000FF;
#define fill(c0,c1,c2)\
for (e=1;e;)\
for (e=0,y=1;y<pic1.ys-1;y++)\
for ( x=1;x<pic1.xs-1;x++)\
if (pic1.p[y][x].dd==c0)\
if ((pic1.p[y-1][x].dd==c1)\
||(pic1.p[y+1][x].dd==c1)\
||(pic1.p[y][x-1].dd==c1)\
||(pic1.p[y][x+1].dd==c1)) { e=1; pic1.p[y][x].dd=c2; }
pic1=pic0;
for (x=0 ,y=0;y<pic1.ys;y++) pic1.p[y][x].dd=co;
for (x=pic1.xs-1,y=0;y<pic1.ys;y++) pic1.p[y][x].dd=co;
for (x=0,y=0 ;x<pic1.xs;x++) pic1.p[y][x].dd=co;
for (x=0,y=pic1.ys-1;x<pic1.xs;x++) pic1.p[y][x].dd=co;
fill(c0,co,co);
fill(c1,co,co);
fill(c0,co,ci);
fill(c0,ci,ci);
for (y=0;y<pic1.ys;y++)
for (x=0;x<pic1.xs;x++)
{
e=c0;
if ((pic0.p[y][x].dd==c1)||(pic1.p[y][x].dd==ci)) e=c1;
pic1.p[y][x].dd=e;
}
#undef fill
这是阶段的样子:
算法如下:
- 绘制带有
co
(某些未使用的颜色)的生长填充起始点的边框矩形
- 将外边框扩展到最近的文本边缘,使用
co
- 使用
co
填充外部边缘(它们会消失)
- 创建带有
ci
(某些未使用的颜色)的外部填充边缘
- 使用
ci
填充内部
合并/重新着色源图像和结果图像
从源图像复制边缘,从结果图像复制内部,其余是空白区域
我使用自己的图片类来处理图片,因此一些成员变量是:
xs,ys
:图片的像素大小
p[y][x].dd
:32位整数类型的(x,y)位置处的像素
clear(color)
:清除整个图像
resize(xs,ys)
:调整图像的分辨率
如果您有具有更多层的特殊字符
然后只需添加更多的阶段... 层
是从最内部空间/孔到外部空间可以有多少层,也可以循环直到找不到更多的层。