在生成的条形码中加粗字符串的一部分

时间:2016-04-19 08:17:33

标签: c# winforms visual-studio barcode

我正在生成条形码作为图像。条形码由几个不同的值组成,例如数量,长度,宽度和m2。这些数字显示在条形码下方,作为所有用户条目的摘要。有没有办法在条形码下的摘要中加粗或加下m2(平方米)?请参阅下面的示例:

Sample outcome

这是我用来生成条形码的代码:

private void generate_Click(object sender, EventArgs e)
        {

            String barcode = summary.Text;
            Bitmap bitmap = new Bitmap(barcode.Length * 40, 150);
            using (Graphics graphics = Graphics.FromImage(bitmap))
            {
            Font ofont = new System.Drawing.Font("IDAutomationHC39M", 20);
            PointF point = new PointF (2f, 2f);
                SolidBrush black = new SolidBrush(Color.Black);
                SolidBrush White = new SolidBrush(Color.White);
                graphics.FillRectangle(White, 0, 0, bitmap.Width, bitmap.Height);
                graphics.DrawString("*" + barcode + "*", ofont, black, point);
            }
            using (MemoryStream ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Png);
                box4.Image = bitmap;
                box4.Height = bitmap.Height;
                box4.Width = bitmap.Width;
            }
        }

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用接受字体样式的Font构造函数(docs

new System.Drawing.Font("IDAutomationHC39M", 20, FontStyle.Bold);

问题在于确定文本的哪个部分应该是粗体,这意味着您必须在某个点分割文本,并确定粗体文本的偏移量

由于你正在使用的字体(IDAutomationHC39M),也会渲染条形码,除非你找到一个不同的字体,允许你分别渲染条形图,否则这不会起作用。文本。这为您提供了一些选择。

  1. 单独字体
  2. 不要制作想要加粗的文字
  3. 以不同的方式突出显示,以不同的颜色为文本着色,使其突出/在其下画一条线等等

答案 1 :(得分:1)

如果这只是文字

您需要将文本分成两部分,

string barcode1; //the normal bit
string barcode2; //the bold/underlined bit

Font ofont = new System.Drawing.Font("IDAutomationHC39M", 20);
Font ofontBold = new System.Drawing.Font("IDAutomationHC39M", 20, FontStyle.Bold);

然后分三个阶段渲染文本,测量每个前一部分的偏移量:

graphics.DrawString("*" + barcode1, ofont, black, point);

var point2 = new PointF(point.X + graphics.MeasureString("*" + barcode1, ofont).Width, point.Y);
graphics.DrawString(barcode2, ofontBold, black, point2);

var point3 = new PointF(point2.X + graphics.MeasureString(barcode2, ofontBold).Width, point2.Y);
graphics.DrawString("*", ofont, black, point3);

但字体包含行

所以我认为你能做的最好的事情是使用相同的字符串测量技术绘制下划线:

string barcode1; //the normal bit
string barcode2; //the underlined bit

var lineStartX = point.X + graphics.MeasureString("*" + barcode1, ofont).Width;
var lineWidth = graphics.MeasureString(barcode2).Width;