如果一个数组按照实心字的点阵存放信息,那么如何根据这个数组来得到一个空心字数组呢?
有一个比较简单的实现方法。假设数组中需要显示点阵的地方值为1,不需要显示的值为0。先复制实心字数组A,得到一个数组B。在数组B中,把所有在数组A中值为1的元素周围(上下左右)4个元素的值都赋值为1,然后再根据实心字数组A,把所有在数组A中值为1的位置,在数组B中赋值为0,即掏空原先所显示的。这样就可以得到空心字数组。
下面用程序来验证一下:
static
void
Main(
string
[] args)
... {
CreateCharSet("G", 24);
Console.ReadLine();
}
public static Bitmap GetCharBMP( string str, int size)
... {
StringFormat sf = new StringFormat(); // 设置格式
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Near;
Bitmap bmp = new Bitmap(size, size); // 新建位图变量
Graphics g = Graphics.FromImage(bmp);
g.DrawString(str, new Font("宋体", size * 3 / 4), Brushes.Black, new Rectangle(0, 0, size, size), sf); // 向图像变量输出字符
return bmp;
}
public static void CreateCharSet( string str, int size)
... {
char[,] charSet = new char[size, size]; //实心字数组
char[,] charSet2 = new char[size, size]; //空心字数组
Bitmap bmp = GetCharBMP(str.ToString(), size); // 获取待分析的字符位图
for (int i = 0; i < size; i++)
...{
for (int j = 0; j < size; j++)
...{
//根据位图的点阵信息,设置数组的值
if (bmp.GetPixel(j, i) == Color.FromArgb(0, 0, 0))
...{
Console.Write("*");
charSet[j, i] = '*';
charSet2[j, i] = '*';
if (j > 0)
...{
charSet2[j - 1, i] = '*';
}
if (j < size - 1)
...{
charSet2[j + 1, i] = '*';
}
if (i < size - 1)
...{
charSet2[j, i + 1] = '*';
}
if (i > 0)
...{
charSet2[j, i - 1] = '*';
}
}
else
...{
Console.Write(" ");
charSet[j, i] = ' ';
}
}
Console.WriteLine("");
}
//掏空并输出空心字
for (int i = 0; i < size; i++)
...{
for (int j = 0; j < size; j++)
...{
if (charSet[j, i] == '*')
...{
charSet2[j, i] = ' ';
}
Console.Write(charSet2[j, i].ToString());
}
Console.WriteLine("");
}
}
... {
CreateCharSet("G", 24);
Console.ReadLine();
}
public static Bitmap GetCharBMP( string str, int size)
... {
StringFormat sf = new StringFormat(); // 设置格式
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Near;
Bitmap bmp = new Bitmap(size, size); // 新建位图变量
Graphics g = Graphics.FromImage(bmp);
g.DrawString(str, new Font("宋体", size * 3 / 4), Brushes.Black, new Rectangle(0, 0, size, size), sf); // 向图像变量输出字符
return bmp;
}
public static void CreateCharSet( string str, int size)
... {
char[,] charSet = new char[size, size]; //实心字数组
char[,] charSet2 = new char[size, size]; //空心字数组
Bitmap bmp = GetCharBMP(str.ToString(), size); // 获取待分析的字符位图
for (int i = 0; i < size; i++)
...{
for (int j = 0; j < size; j++)
...{
//根据位图的点阵信息,设置数组的值
if (bmp.GetPixel(j, i) == Color.FromArgb(0, 0, 0))
...{
Console.Write("*");
charSet[j, i] = '*';
charSet2[j, i] = '*';
if (j > 0)
...{
charSet2[j - 1, i] = '*';
}
if (j < size - 1)
...{
charSet2[j + 1, i] = '*';
}
if (i < size - 1)
...{
charSet2[j, i + 1] = '*';
}
if (i > 0)
...{
charSet2[j, i - 1] = '*';
}
}
else
...{
Console.Write(" ");
charSet[j, i] = ' ';
}
}
Console.WriteLine("");
}
//掏空并输出空心字
for (int i = 0; i < size; i++)
...{
for (int j = 0; j < size; j++)
...{
if (charSet[j, i] == '*')
...{
charSet2[j, i] = ' ';
}
Console.Write(charSet2[j, i].ToString());
}
Console.WriteLine("");
}
}
输出结果:
1)实心字
2)空心字