Приветствую! Речь пойдет о создании программы, которая сможет кодировать информацию в штрих код. Рассмотрим мы два варианта: EAN13 и Code 128.
Для начала разберемся что же предоставляет собой штрих код, и начнем с формата EAN 13. Внешне штрих код состоит из черных и белых полос. Каждая из полос согласно стандарту имеет ширину 0,33мм. А теперь посмотрим немного глубже. Согласно стандарту, информация в штрих коде алгоритмом конвертируется в последовательность нулей и единиц. Черная полоса соответствует «1» а белая соответственно «0». Таким образом мы получаем штрих код. То, что описано выше, справедливо для обоих форматов, а теперь перейдем к специфике форматов. EAN 13 код фактически может иметь 12 символов информации (обычно она разделяется на код страны, код завода, и.т.д., но никто вам не мешает создать штрих код с любыми цифрами). 13 цифра в штрих коде ( а он EAN 13 имеет их именно 13) является контрольной суммой. Она используется для проверки правильности декодирования, а также в зависимости то нее выбирается соответствующая таблица кодирования. Вот и все по формату EAN 13. Детальная информация об алгоритме кодирования и о расчете контрольной цифры есть тут:
Итак, что нам нужно сделать для программной генерации штрих кода (причем обоих форматов):
Создавая программу, я сделал так:
Создал форму, на которой есть поля для выбора формата, ввода кода, регулятор ширины штриха ну и кнопка генерации кода и сохранение изображения в буфер обмена. Получилось так:
Проверял я с помощью Abbyy FineReader 10 Professional:

Каждый из форматов штрих кода я оформил в виде отдельного класа, который из кода образует двоичную последовательность. Кстати, формат EAN 13 мне показался немного тяжелее в реализации в силу того, что там в зависимости от кода меняется таблица. в результате чего сам код рисовался так:
тут scale типа float — ширина полосы, задается из формы п��средством DataBinding.
Еще немного расскажу о коде Code128. Тут кодирование просто по таблице, но структура имеет зону начала, конца, перемещения. Под перемещением имею ввиду переход от отдной кодовой таблице к другой (см. Code128A, Code 128B, Code 128C)
Данный код в отличие от предыдущего, имеет произвольную длину и может состоять из всех ASCII от 1 до 128. Об алгоритме есть достаточно много инфы, я брал отсюда: Источник
( www.barcodeman.com/info/c128.php3 ).
Ну вот и все, основное сказал. Напоследок приложу свой код, который я написал для конвертации информации в двоичное представление кода. Код, возможно не совсем корректно работает, возможно не оптимально работает. Я не даю никакой гарантии.
Код тут: pastebin.com/xsGVe9tG
Для начала разберемся что же предоставляет собой штрих код, и начнем с формата EAN 13. Внешне штрих код состоит из черных и белых полос. Каждая из полос согласно стандарту имеет ширину 0,33мм. А теперь посмотрим немного глубже. Согласно стандарту, информация в штрих коде алгоритмом конвертируется в последовательность нулей и единиц. Черная полоса соответствует «1» а белая соответственно «0». Таким образом мы получаем штрих код. То, что описано выше, справедливо для обоих форматов, а теперь перейдем к специфике форматов. EAN 13 код фактически может иметь 12 символов информации (обычно она разделяется на код страны, код завода, и.т.д., но никто вам не мешает создать штрих код с любыми цифрами). 13 цифра в штрих коде ( а он EAN 13 имеет их именно 13) является контрольной суммой. Она используется для проверки правильности декодирования, а также в зависимости то нее выбирается соответствующая таблица кодирования. Вот и все по формату EAN 13. Детальная информация об алгоритме кодирования и о расчете контрольной цифры есть тут:
Итак, что нам нужно сделать для программной генерации штрих кода (причем обоих форматов):
- Настроить графический интерфейс так, чтоб 1 юниту соответствовало 0.33 мм
- Конвертировать код в двоичную последовательность (из «0» и «1»)
- Отобразить последовательность таким образом что каждая единица- прямоугольник с шириной 0,33 мм. Замечу, что можно изменять величину штриха, но по стандарту сказано 0,33мм.
Создавая программу, я сделал так:
Создал форму, на которой есть поля для выбора формата, ввода кода, регулятор ширины штриха ну и кнопка генерации кода и сохранение изображения в буфер обмена. Получилось так:

Проверял я с помощью Abbyy FineReader 10 Professional:

Каждый из форматов штрих кода я оформил в виде отдельного класа, который из кода образует двоичную последовательность. Кстати, формат EAN 13 мне показался немного тяжелее в реализации в силу того, что там в зависимости от кода меняется таблица. в результате чего сам код рисовался так:
Bitmap bmp; private void button1_Click(object sender, EventArgs e) { Graphics g = panel1.CreateGraphics(); g.PageUnit = GraphicsUnit.Millimeter; if (comboBox1.Text == "EAN 13") { g.PageScale = scale; //g.DrawRectangle(new Pen(new SolidBrush(Color.Black)), 1, 1, 501, 1010); EAN13 ean = new EAN13(textBox1.Text); int cnt = ean.output.Length; panel1.Width = cnt ; float x = g.DpiX; int s1 =Convert.ToInt32( cnt * scale)+1; int s2 = Convert.ToInt32(s1 / 25.4); int res =(int) x * s2; panel1.Width = res; Draw(ref g, ean.output); } if (comboBox1.Text == "Code 128") { g.PageScale = scale; Code128B code = new Code128B(textBox1.Text); int cnt = code.output.Length; float x = g.DpiX; int s1 =Convert.ToInt32( cnt * scale)+1; int s2 = Convert.ToInt32(s1 / 25.4); int res =(int) x * s2; panel1.Width = res; Draw(ref g, code.output); bmp=new Bitmap(panel1.Width,panel1.Height); Graphics h=Graphics.FromImage(bmp); Draw(ref h, code.output); } }
тут scale типа float — ширина полосы, задается из формы п��средством DataBinding.
Еще немного расскажу о коде Code128. Тут кодирование просто по таблице, но структура имеет зону начала, конца, перемещения. Под перемещением имею ввиду переход от отдной кодовой таблице к другой (см. Code128A, Code 128B, Code 128C)
Данный код в отличие от предыдущего, имеет произвольную длину и может состоять из всех ASCII от 1 до 128. Об алгоритме есть достаточно много инфы, я брал отсюда: Источник
( www.barcodeman.com/info/c128.php3 ).
Ну вот и все, основное сказал. Напоследок приложу свой код, который я написал для конвертации информации в двоичное представление кода. Код, возможно не совсем корректно работает, возможно не оптимально работает. Я не даю никакой гарантии.
Код тут: pastebin.com/xsGVe9tG
