生成条形码 - 应用程序运行无错,但不生成条形码

时间:2016-04-13 20:53:02

标签: c# winforms visual-studio

最近我设法让应用程序正常运行而没有错误。

问题在于它应该生成一个带有文本的条形码;它的作用是,它只生成带有文本的图像 - 没有条形码。

我使用的是字体IDAutomationHC39M。应用程序应将文本转换为条形码。

请参阅以下代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            String barcode = pole.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);
                box.Image = bitmap;
                box.Height = bitmap.Height;
                box.Width = bitmap.Width;
            }
        }

        private void pole_TextChanged(object sender, EventArgs e)
        {

        }
    }
}  

1 个答案:

答案 0 :(得分:2)

您的代码中存在一些小问题,即GDI资源的泄漏以及您创建的位图的不精确测量。

这是一个处理这些问题的版本:

    String barcode = "*" + pole.Text + "*";
    PointF point = new PointF(5f, 5f);
    float fontHeight = 20f;
    Bitmap bitmap = new Bitmap(123,123);
    using (Font ofont = new System.Drawing.Font("IDAutomationHC39M", fontHeight))
    {    // create a Graphics object to measure the barcode
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            Size sz = Size.Round(graphics.MeasureString( barcode, ofont));
            bitmap = new Bitmap(sz.Width + 10, sz.Height + 10);
        } // create a new one with the right size to work on
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            graphics.Clear(Color.White);
            graphics.DrawString(barcode, ofont, Brushes.Black, point);
        }
    }
    box.Image = bitmap;
    box.ClientSize = bitmap.Size;

    // bitmap.Save(fileName, ImageFormat.Png);

但您的主要问题最有可能来自使用不完全兼容的字体。有许多免费字体,但并非所有字体都同样有效。

我发现this font工作正常,但无法获得this one to work directly,虽然我的一个旧程序枚举已安装的字体,但确实可以使用它。但即使是设计师也拒绝使用它,所以它不仅仅是名字......

以下是一个示例:

enter image description here