Приветствую! Речь пойдет о создании программы, которая сможет кодировать информацию в штрих код. Рассмотрим мы два варианта: 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