当前位置: 移动技术网 > IT编程>开发语言>c# > 史上最简洁C# 生成条形码图片思路及示例分享

史上最简洁C# 生成条形码图片思路及示例分享

2019年07月18日  | 移动技术网IT编程  | 我要评论

在网上看到一些人写关于条形码的代码都很长,有的甚至拿来卖,所以查了下资料,希望能对大家有帮助。

  我的实现原理是:

  其实windows本身就有一个字体是用来显示条形码的。

  只要将数字改为这种字体就变成了条形码。

  windows字体库下,有如下八种字体可以用来将数字转换成条形码:

复制代码 代码如下:

  code39azaleanarrow1
  code39azaleanarrow2
  code39azaleanarrow3
  code39azalearegular1
  code39azalearegular2
  code39azaleawide1
  code39azaleawide2
  code39azaleawide3

  把代码贴给大家参考:

复制代码 代码如下:

  bitmap b=new bitmap(200,200);
  graphics g = graphics.fromimage(b);
  font font = new font("code39azalearegular2", 32);
  g.drawstring("123456", font, brushes.black, new pointf(100,100)); 
  picturebox1.backgroundimage = b;
  picturebox1.backgroundimagelayout = imagelayout.zoom。

是不是很简单呢,亲们,思路给大家了,具体使用到项目中的时候,小伙伴们自己扩展下就可以了。

另附上一则示例中的应用

复制代码 代码如下:

using system;
using system.collections.generic;
using system.web;
using system.drawing;
using system.drawing.imaging;
using system.drawing.drawing2d;
using system.drawing.text;
using system.drawing.design;
using system.io;
using system.collections;
namespace public.equipment
{
    /// <summary>
    ///绘制条形码
    /// </summary>
    public class drawingbarcode
    {
        public drawingbarcode()
        {
            //
            //todo: 在此处添加构造函数逻辑
            //
        }
        #region 根据字体产生条形码
        /// <summary>
        /// 根据条形码绘制图片
        /// </summary>
        /// <param name="strnumber">条形码</param>
        public void drawingbarcode(string strnumber)
        {
            privatefontcollection fonts = new privatefontcollection();
            //39带数字
            //fonts.addfontfile(httpcontext.current.server.mappath(".") + "/barcodefonts/v100010_.ttf");
            //fontfamily ff = new fontfamily("c39hrp48dltt", fonts);
            //39码
            strnumber = "*" + strnumber + "*";
            fonts.addfontfile(httpcontext.current.server.mappath(".") + "/barcodefonts/free3of9x.ttf");
            fontfamily ff = new fontfamily("free 3 of 9 extended", fonts);
            //接近条形码
            //fonts.addfontfile(httpcontext.current.server.mappath(".") + "/barcodefonts/v100014_.ttf");
            //fontfamily ff = new fontfamily("c39p24dltt", fonts);
            font font = new font(ff, 12);
            //设置图片大小
            image img = new bitmap(1, 1);
            graphics g = graphics.fromimage(img);
            sizef fontsize = g.measurestring(strnumber, font);
            int intwidth = convert.toint32(fontsize.width);
            int intheight = convert.toint32(fontsize.height);
            g.dispose();
            img.dispose();
            img = new bitmap(intwidth, intheight);
            g = graphics.fromimage(img);
            g.clear(color.white);
            g.compositingquality = compositingquality.highquality;
            g.smoothingmode = smoothingmode.highquality;
            g.drawstring(strnumber, font, brushes.black, 0, 0);
            memorystream stream = new memorystream();
            img.save(stream, imageformat.jpeg);
            httpcontext.current.response.clearcontent();
            httpcontext.current.response.contenttype = "image/jpeg";
            httpcontext.current.response.binarywrite(stream.toarray());
            g.dispose();
            img.dispose();
        }
        /// <summary>
        /// 根据条形码绘制图片
        /// </summary>
        /// <param name="strnumber">条形码</param>
        /// <param name="intfontsize">字体大小</param>
        public void drawingbarcode(string strnumber,int intfontsize)
        {
            privatefontcollection fonts = new privatefontcollection();
            //39带数字
            //fonts.addfontfile(httpcontext.current.server.mappath(".") + "/barcodefonts/v100010_.ttf");
            //fontfamily ff = new fontfamily("c39hrp48dltt", fonts);
            //39码
             strnumber = "*" + strnumber + "*";
            fonts.addfontfile(httpcontext.current.server.mappath(".") + "/barcodefonts/free3of9x.ttf");
            fontfamily ff = new fontfamily("free 3 of 9 extended", fonts);
            //接近条形码
            //fonts.addfontfile(httpcontext.current.server.mappath(".") + "/barcodefonts/v100014_.ttf");
            //fontfamily ff = new fontfamily("c39p24dltt", fonts);
            font font = new font(ff, intfontsize);
            //设置图片大小
            image img = new bitmap(1, 1);
            graphics g = graphics.fromimage(img);
            sizef fontsize = g.measurestring(strnumber, font);
            int intwidth = convert.toint32(fontsize.width);
            int intheight = convert.toint32(fontsize.height);
            g.dispose();
            img.dispose();
            img = new bitmap(intwidth, intheight);
            g = graphics.fromimage(img);
            g.clear(color.white);
            g.compositingquality = compositingquality.highquality;
            g.smoothingmode = smoothingmode.highquality;
            g.drawstring(strnumber, font, brushes.black, 0, 0);
            memorystream stream = new memorystream();
            img.save(stream, imageformat.jpeg);
            httpcontext.current.response.clearcontent();
            httpcontext.current.response.contenttype = "image/jpeg";
            httpcontext.current.response.binarywrite(stream.toarray());
            g.dispose();
            img.dispose();
        }
        #endregion
        #region 绘制code39码
        /// <summary>
        /// 根据条形码绘制图片
        /// </summary>
        /// <param name="strnumber">条形码</param>
        public void drawingbarcode39(string strnumber,int intfontsize,bool withstart)
        {
            viewfont = new font("宋体", intfontsize);
            image img = getcodeimage(strnumber, code39model.code39normal, withstart);
            memorystream stream = new memorystream();
            img.save(stream, imageformat.jpeg);
            httpcontext.current.response.clear();
            httpcontext.current.response.clearcontent();
            httpcontext.current.response.bufferoutput = true;
            httpcontext.current.response.contenttype = "image/jpeg";
            httpcontext.current.response.binarywrite(stream.getbuffer());
            httpcontext.current.response.flush();
        }
        private hashtable m_code39 = new hashtable();
        private byte m_magnify = 0;
        /// <summary>
        /// 放大倍数
        /// </summary>
        public byte magnify { get { return m_magnify; } set { m_magnify = value; } }
        private int m_height = 40;
        /// <summary>
        /// 图形高
        /// </summary>
        public int height { get { return m_height; } set { m_height = value; } }
        private font m_viewfont = null;
        /// <summary>
        /// 字体大小
        /// </summary>
        public font viewfont { get { return m_viewfont; } set { m_viewfont = value; } }
        /**
         code39码的编码规则是:
           1、 每五条线表示一个字符;
           2、 粗线表示1,细线表示0;
           3、 线条间的间隙宽的表示1,窄的表示0;
           4、 五条线加上它们之间的四条间隙就是九位二进制编码,而且这九位中必定有三位是1,所以称为39码;
           5、 条形码的首尾各一个*标识开始和结束
         */
        public drawingbarcode(boolean iscode39)
        {
            m_code39.add("a", "1101010010110");
            m_code39.add("b", "1011010010110");
            m_code39.add("c", "1101101001010");
            m_code39.add("d", "1010110010110");
            m_code39.add("e", "1101011001010");
            m_code39.add("f", "1011011001010");
            m_code39.add("g", "1010100110110");
            m_code39.add("h", "1101010011010");
            m_code39.add("i", "1011010011010");
            m_code39.add("j", "1010110011010");
            m_code39.add("k", "1101010100110");
            m_code39.add("l", "1011010100110");
            m_code39.add("m", "1101101010010");
            m_code39.add("n", "1010110100110");
            m_code39.add("o", "1101011010010");
            m_code39.add("p", "1011011010010");
            m_code39.add("q", "1010101100110");
            m_code39.add("r", "1101010110010");
            m_code39.add("s", "1011010110010");
            m_code39.add("t", "1010110110010");
            m_code39.add("u", "1100101010110");
            m_code39.add("v", "1001101010110");
            m_code39.add("w", "1100110101010");
            m_code39.add("x", "1001011010110");
            m_code39.add("y", "1100101101010");
            m_code39.add("z", "1001101101010");
            m_code39.add("0", "1010011011010");
            m_code39.add("1", "1101001010110");
            m_code39.add("2", "1011001010110");
            m_code39.add("3", "1101100101010");
            m_code39.add("4", "1010011010110");
            m_code39.add("5", "1101001101010");
            m_code39.add("6", "1011001101010");
            m_code39.add("7", "1010010110110");
            m_code39.add("8", "1101001011010");
            m_code39.add("9", "1011001011010");
            m_code39.add("+", "1001010010010");
            m_code39.add("-", "1001010110110");
            m_code39.add("*", "1001011011010");
            m_code39.add("/", "1001001010010");
            m_code39.add("%", "1010010010010");
            m_code39.add("$", "1001001001010");
            m_code39.add(".", "1100101011010");
            m_code39.add(" ", "1001101011010");
        }
        public enum code39model
        {
            /// <summary>
            /// 基本类别 1234567890abc
            /// </summary>
            code39normal,
            /// <summary>
            /// 全ascii方式 +a+b 来表示小写
            /// </summary>
            code39fullascii
        }
        /// <summary>
        /// 获得条码图形
        /// </summary>
        /// <param name="p_text">文字信息</param>
        /// <param name="p_model">类别</param>
        /// <param name="p_starchar">是否增加前后*号</param>
        /// <returns>图形</returns>
        public bitmap getcodeimage(string p_text, code39model p_model, bool p_starchar)
        {
            string _valuetext = "";
            string _codetext = "";
            char[] _valuechar = null;
            switch (p_model)
            {
                case code39model.code39normal:
                    _valuetext = p_text.toupper();
                    break;
                default:
                    _valuechar = p_text.tochararray();
                    for (int i = 0; i != _valuechar.length; i++)
                    {
                        if ((int)_valuechar[i] >= 97 && (int)_valuechar[i] <= 122)
                        {
                            _valuetext += "+" + _valuechar[i].tostring().toupper();
                        }
                        else
                        {
                            _valuetext += _valuechar[i].tostring();
                        }
                    }
                    break;
            }
            _valuechar = _valuetext.tochararray();
            if (p_starchar == true) _codetext += m_code39["*"];
            for (int i = 0; i != _valuechar.length; i++)
            {
                if (p_starchar == true && _valuechar[i] == '*') throw new exception("带有起始符号不能出现*");
                object _charcode = m_code39[_valuechar[i].tostring()];
                if (_charcode == null) throw new exception("不可用的字符" + _valuechar[i].tostring());
                _codetext += _charcode.tostring();
            }
            if (p_starchar == true) _codetext += m_code39["*"];
            bitmap _codebmp = getimage(_codetext);
            getviewimage(_codebmp, p_text);
            return _codebmp;
        }
        /// <summary>
        /// 绘制编码图形
        /// </summary>
        /// <param name="p_text">编码</param>
        /// <returns>图形</returns>
        private bitmap getimage(string p_text)
        {
            char[] _value = p_text.tochararray();
            //宽 == 需要绘制的数量*放大倍数 + 两个字的宽   
            bitmap _codeimage = new bitmap(_value.length * ((int)m_magnify + 1), (int)m_height);
            graphics _garphics = graphics.fromimage(_codeimage);
            _garphics.fillrectangle(brushes.white, new rectangle(0, 0, _codeimage.width, _codeimage.height));
            int _lenex = 0;
            for (int i = 0; i != _value.length; i++)
            {
                int _drawwidth = m_magnify + 1;
                if (_value[i] == '1')
                {
                    _garphics.fillrectangle(brushes.black, new rectangle(_lenex, 0, _drawwidth, m_height));
                }
                else
                {
                    _garphics.fillrectangle(brushes.white, new rectangle(_lenex, 0, _drawwidth, m_height));
                }
                _lenex += _drawwidth;
            }
            _garphics.dispose();
            return _codeimage;
        }
        /// <summary>
        /// 绘制文字,文字宽度大于图片宽度将不显示
        /// </summary>
        /// <param name="p_codeimage">图形</param>
        /// <param name="p_text">文字</param>
        private void getviewimage(bitmap p_codeimage, string p_text)
        {
            if (m_viewfont == null) return;
            graphics _graphics = graphics.fromimage(p_codeimage);
            sizef _fontsize = _graphics.measurestring(p_text, m_viewfont);
            if (_fontsize.width > p_codeimage.width || _fontsize.height > p_codeimage.height - 20)
            {
                _graphics.dispose();
                return;
            }
            int _starheight = p_codeimage.height - (int)_fontsize.height;
            _graphics.fillrectangle(brushes.white, new rectangle(0, _starheight, p_codeimage.width, (int)_fontsize.height));
            int _starwidth = (p_codeimage.width - (int)_fontsize.width) / 2;
            _graphics.drawstring(p_text, m_viewfont, brushes.black, _starwidth, _starheight);
            _graphics.dispose();
        }
        #endregion
    }
}

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网