Как стать автором
Обновить

Штриховое кодирование: программная реализация на С#

Время на прочтение 3 мин
Количество просмотров 20K
Приветствую! Речь пойдет о создании программы, которая сможет кодировать информацию в штрих код. Рассмотрим мы два варианта: EAN13 и Code 128.

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

Итак, что нам нужно сделать для программной генерации штрих кода (причем обоих форматов):
  1. Настроить графический интерфейс так, чтоб 1 юниту соответствовало 0.33 мм
  2. Конвертировать код в двоичную последовательность (из «0» и «1»)
  3. Отобразить последовательность таким образом что каждая единица- прямоугольник с шириной 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
Теги:
Хабы:
+19
Комментарии 33
Комментарии Комментарии 33

Публикации

Истории

Работа

.NET разработчик
66 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн