2014年7月16日 星期三

利用GDI+繪製條碼(Code 39)標籤

參考引用來源:利用GDI+繪製條碼(Code 39)標籤
--
1.前言:
在生產系統中,需要用到大量的條碼標籤列印,本範例利用GDI+繪圖的方式,產生條碼的圖檔,可供列印條碼標籤。

2.說明:
條碼的基本說明可參考
http://en.wikipedia.org/wiki/Barcode
本範例介紹Code39條碼,其相關資訊請參考
http://en.wikipedia.org/wiki/Code_39

建立CodeSystem類別

public class CodeSystem
{
    public static Hashtable Code39()
    {
        Hashtable code = new Hashtable();

        code.Add("0", "bwbWBwBwb");
        code.Add("1", "BwbWbwbwB");
        code.Add("2", "bwBWbwbwB");
        code.Add("3", "BwBWbwbwb");
        code.Add("4", "bwbWBwbwB");
        code.Add("5", "BwbWBwbwb");
        code.Add("6", "bwBWBwbwb");
        code.Add("7", "bwbWbwBwB");
        code.Add("8", "BwbWbwBwb");
        code.Add("9", "bwBWbwBwb");
        code.Add("A", "BwbwbWbwB");
        code.Add("B", "bwBwbWbwB");
        code.Add("C", "BwBwbWbwb");
        code.Add("D", "bwbwBWbwB");
        code.Add("E", "BwbwBWbwb");
        code.Add("F", "bwBwBWbwb");
        code.Add("G", "bwbwbWBwB");
        code.Add("H", "BwbwbWBwb");
        code.Add("I", "bwBwbWBwb");
        code.Add("J", "bwbwBWBwb");
        code.Add("K", "BwbwbwbWB");
        code.Add("L", "bwBwbwbWB");
        code.Add("M", "BwBwbwbWb");
        code.Add("N", "bwbwBwbWB");
        code.Add("O", "BwbwBwbWb");
        code.Add("P", "bwBwBwbWb");
        code.Add("Q", "bwbwbwBWB");
        code.Add("R", "BwbwbwBWb");
        code.Add("S", "bwBwbwBWb");
        code.Add("T", "bwbwBwBWb");
        code.Add("U", "BWbwbwbwB");
        code.Add("V", "bWBwbwbwB");
        code.Add("W", "BWBwbwbwb");
        code.Add("X", "bWbwBwbwB");
        code.Add("Y", "BWbwBwbwb");
        code.Add("Z", "bWBwBwbwb");
        code.Add("-", "bWbwbwBwB");
        code.Add(".", "BWbwbwBwb");
        code.Add(" ", "bWBwbwBwb");
        code.Add("$", "bWbWbWbwb");
        code.Add("/", "bWbWbwbWb");
        code.Add("+", "bWbwbWbWb");
        code.Add("%", "bwbWbWbWb");
        code.Add("*", "bWbwBwBwb");

        return code;
    }
}
建立Code39影像檔方法

private Bitmap Code39(string strInput)
{
    //Code 39 specification
    int narrowWidth = 1;
    int wideWidth = 2;
    int B = wideWidth;//Wide-Black width
    int b = narrowWidth;//Narrow-Black width
    int W = wideWidth;//Wide-White width
    int w = narrowWidth;//Narrow-White width          
    int padding = 15;
    int startPoint = padding;//繪製線條起點
    int strLength = strInput.Length;
    FontFamily fontFamily = new FontFamily("Arial");
    Font myFont = new Font(fontFamily, 9, FontStyle.Regular, GraphicsUnit.Point);
    int barcodeHeight = 60;
    int barcodeWidth = (wideWidth * 3 + narrowWidth * 7) * (strLength + 2); ;

    //定義影像檔
    /*寬度設定定義:
      以A為例,code為BwbwbWbwB加上結尾w共十個字元,其中寬線共三個,窄線共7個;
      字串長度加上前後的*;
      前後留白的寬度x2
    */
    int imgWidth = ((wideWidth * 3 + narrowWidth * 7) * (strLength + 2)) + padding * 2;
    int imgHeight = barcodeHeight + padding * 2;
    pictureBox1.Width = imgWidth;
    pictureBox1.Height = imgHeight;
    Bitmap bitmap = new Bitmap(imgWidth, imgHeight);
    //在image上繪圖
    Graphics g = Graphics.FromImage(bitmap);
    g.PageUnit = GraphicsUnit.Pixel;
    //繪圖品質設定
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
    g.CompositingQuality = CompositingQuality.HighQuality;
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.InterpolationMode = InterpolationMode.High;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    //先將背景色設定為白色
    g.FillRectangle(new SolidBrush(Color.White), 0, 0, bitmap.Width, bitmap.Height);

    string codeString = "";
    Hashtable getCode = CodeSystem.Code39();

    for (int i = 0; i < strInput.Length; i++)
    {
        string character = strInput[i].ToString().ToUpper();
        if (getCode[strInput[i].ToString().ToUpper()] != null && getCode[strInput[i].ToString().ToUpper()].ToString() != "*")
        {
            codeString += getCode[strInput[i].ToString().ToUpper()].ToString() + "w";
        }
        else
        {
            g.DrawString("Invalid\nCharacter", myFont, Brushes.Black, 0, (barcodeHeight + padding * 2) / 3);
            return bitmap;
        }
    }
    //前後用*包起字串,例如*Code39*
    codeString = getCode["*"].ToString() + "w" + codeString + getCode["*"].ToString();
    Console.WriteLine(codeString);
    int shiftPoint = 0;
    for (int i = 0; i < codeString.Length; i++)
    {
        string s = codeString[i].ToString();

        switch (s)
        {
            case "B":
                shiftPoint = B;
                break;
            case "b":
                shiftPoint = b;
                break;
            case "W":
                shiftPoint = W;
                break;
            case "w":
                shiftPoint = w;
                break;
        }

        g.FillRectangle(i % 2 == 0 ? new SolidBrush(Color.Black) : new SolidBrush(Color.White), startPoint, padding, shiftPoint, barcodeHeight);
        startPoint += shiftPoint;
    }

    //Draw footer string
    string footerString = "*" + strInput + "*";
    //g.DrawString(footerString, myFont, Brushes.Black, (float)(padding / 2f + imgWidth / 2f - (footerString.Length * myFont.Size / 2f)), (float)(barcodeHeight + padding + 2f));
    TextRenderer.DrawText(g, footerString, myFont, new Point((int)(padding / 2f + imgWidth / 2f - (footerString.Length * myFont.Size / 2f)), (int)(barcodeHeight + padding + 2f)), SystemColors.ControlText);

    return bitmap;
}
3.應用:

//定義影像檔
Bitmap bitmap = Code39("PIXNET");
//顯示影像
pictureBox1.Image = bitmap;

沒有留言:

張貼留言