为字母绘制矩形框
Draw rectangle box for letters
我的代码。输出:
Bitmap bitmap = new Bitmap(600, 300, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
GraphicsPath path = new GraphicsPath();
StringFormat format = new StringFormat();
Rectangle rect = new Rectangle(0, 0, 600, 300);
SolidBrush Brush = new SolidBrush(Color.White);
g.FillRectangle(Brush, rect);
g.SmoothingMode = SmoothingMode.AntiAlias;
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
path.AddString(textBox1.Text, FontFamily.GenericSansSerif, (int)FontStyle.Bold, 128, rect, format);
Brush = new SolidBrush(Color.Blue);
g.FillPath(Brush, path);
float x = path.GetBounds().X;
float y = path.GetBounds().Y;
float w = path.GetBounds().Width / textBox1.Text.Length;
float h = path.GetBounds().Height;
Pen redPen = new Pen(Color.Red, 2);
for (int i = 0; i < textBox1.Text.Length+1; i++)
{
rect = new Rectangle((int)x, (int)y, (int)w*i, (int)h);
g.DrawRectangle(redPen, rect);
}
pictureBox1.Image = bitmap;
我在输出中得到了错误的结果,因为我无法获得字母的角并且使用了错误的方式。
但我需要获得正确的字母角像素,绘制矩形并填充它。
像这样:
这一行让我在你的代码中发现了一个错误:
for (int i = 0; i < textBox1.Text.Length+1; i++)
应该是:
for (int i = 0; i < textBox1.Text.Length; i++)
但后来确实只出现了3个红框
原因是第一个矩形(使用您的代码)非常小,因为宽度为 (int)w*i
。那应该是 (int)w*(i+1)
.
现在回到你画矩形的地方。
如果您使用文本 'WWWW',您会发现您的解决方案似乎还不错。
但是如果你用'IIII'测试,十你应该注意到最左边的'I'在红框里是左对齐的,最右边的'I'是右对齐的在红框内对齐。
您正在绘制 4 个相等的方框,围绕 4 个不同的字母。
一个解决方案是用 monospaced 字体绘制字母。
或者,如果您不想要等宽字体,请查看 How to measure width of character precisely?
我的代码。输出:
Bitmap bitmap = new Bitmap(600, 300, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
GraphicsPath path = new GraphicsPath();
StringFormat format = new StringFormat();
Rectangle rect = new Rectangle(0, 0, 600, 300);
SolidBrush Brush = new SolidBrush(Color.White);
g.FillRectangle(Brush, rect);
g.SmoothingMode = SmoothingMode.AntiAlias;
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
path.AddString(textBox1.Text, FontFamily.GenericSansSerif, (int)FontStyle.Bold, 128, rect, format);
Brush = new SolidBrush(Color.Blue);
g.FillPath(Brush, path);
float x = path.GetBounds().X;
float y = path.GetBounds().Y;
float w = path.GetBounds().Width / textBox1.Text.Length;
float h = path.GetBounds().Height;
Pen redPen = new Pen(Color.Red, 2);
for (int i = 0; i < textBox1.Text.Length+1; i++)
{
rect = new Rectangle((int)x, (int)y, (int)w*i, (int)h);
g.DrawRectangle(redPen, rect);
}
pictureBox1.Image = bitmap;
我在输出中得到了错误的结果,因为我无法获得字母的角并且使用了错误的方式。
但我需要获得正确的字母角像素,绘制矩形并填充它。
像这样:
这一行让我在你的代码中发现了一个错误:
for (int i = 0; i < textBox1.Text.Length+1; i++)
应该是:
for (int i = 0; i < textBox1.Text.Length; i++)
但后来确实只出现了3个红框
原因是第一个矩形(使用您的代码)非常小,因为宽度为 (int)w*i
。那应该是 (int)w*(i+1)
.
现在回到你画矩形的地方。
如果您使用文本 'WWWW',您会发现您的解决方案似乎还不错。
但是如果你用'IIII'测试,十你应该注意到最左边的'I'在红框里是左对齐的,最右边的'I'是右对齐的在红框内对齐。
您正在绘制 4 个相等的方框,围绕 4 个不同的字母。
一个解决方案是用 monospaced 字体绘制字母。
或者,如果您不想要等宽字体,请查看 How to measure width of character precisely?