Алгоритм преобразования цифр в шрих код
От: chico97  
Дата: 21.10.02 12:44
Оценка:
Уважаемые,
есть ли стандартизованный алгоритм преобразования цифр в знаки шрих полосок или что-то в этом роде. просто нуно генерить шрих код изображение из цифр кода.
Re: Алгоритм преобразования цифр в шрих код
От: Кодт Россия  
Дата: 21.10.02 12:54
Оценка:
Здравствуйте chico97, Вы писали:

C>есть ли стандартизованный алгоритм преобразования цифр в знаки шрих полосок или что-то в этом роде. просто нуно генерить шрих код изображение из цифр кода.


Спросил!

Какой именно штрих-код?
Industial 2 of 5, Interleaved 2 of 5 (ITF), UPC/EAN-13, UPC/EAN-8, UPC/EAN extensions, US PostCode -- и это, заметь, только цифровые.
Есть еще текстовые и даже штрихкоды для большого объема данных: PDF-417 (используется на винных акцизных марках), DataMatrix, ну и так далее.

Я — эксперт по штрих-кодам. Можешь спрашивать. Но сначала уточни — что у тебя в тех.задании.
Перекуём баги на фичи!
Re[2]: Алгоритм преобразования цифр в шрих код
От: chico97  
Дата: 21.10.02 13:00
Оценка:
Здравствуйте Кодт, Вы писали:

К>Здравствуйте chico97, Вы писали:


C>>есть ли стандартизованный алгоритм преобразования цифр в знаки шрих полосок или что-то в этом роде. просто нуно генерить шрих код изображение из цифр кода.


К>Спросил!


К>Какой именно штрих-код?

К>Industial 2 of 5, Interleaved 2 of 5 (ITF), UPC/EAN-13, UPC/EAN-8, UPC/EAN extensions, US PostCode -- и это, заметь, только цифровые.
К>Есть еще текстовые и даже штрихкоды для большого объема данных: PDF-417 (используется на винных акцизных марках), DataMatrix, ну и так далее.

К>Я — эксперт по штрих-кодам. Можешь спрашивать. Но сначала уточни — что у тебя в тех.задании.


Спасибо, счас побегу к кладовщикам и логистикам: попробую это у них уточнить. а то боссы сказали надо генерить наклейки со штрих кодами, "...а что, почему, не пойму..."
Re[2]: Алгоритм преобразования цифр в шрих код
От: chico97  
Дата: 21.10.02 13:15
Оценка:
Здравствуйте Кодт, Вы писали:

К>Здравствуйте chico97, Вы писали:


C>>есть ли стандартизованный алгоритм преобразования цифр в знаки шрих полосок или что-то в этом роде. просто нуно генерить шрих код изображение из цифр кода.


К>Спросил!


К>Какой именно штрих-код?

К>Industial 2 of 5, Interleaved 2 of 5 (ITF), UPC/EAN-13, UPC/EAN-8, UPC/EAN extensions, US PostCode -- и это, заметь, только цифровые.
К>Есть еще текстовые и даже штрихкоды для большого объема данных: PDF-417 (используется на винных акцизных марках), DataMatrix, ну и так далее.

К>Я — эксперт по штрих-кодам. Можешь спрашивать. Но сначала уточни — что у тебя в тех.задании.


Короче, никто ничего не знает. А по каким признакам можно эти виды штрих кодов идентифицировать? Может по кол-ву цифп или еще по чему-нибудь?
Re[3]: Алгоритм преобразования цифр в шрих код
От: Кодт Россия  
Дата: 21.10.02 14:21
Оценка: 130 (14)
Здравствуйте chico97, Вы писали:

C>Короче, никто ничего не знает.


Сходи туда — не знаю куда.
А для чего им вообще захотелось штрихкоды лепить? Для понтов, что ли?
Все же попытайся найти того человека, который толкнул эту идею, и расспроси его.

Штрихкод применяют
— для автоматизации складского учета
— — по марке товара — тогда используют стандартные, напр., EAN-13 (большинство товаров уже промаркировано)
— — по другим признакам — используют любой штрихкод (как правило, ITF или Code39/Code93)
— для логистики
— — по европейским и американским стандартам — используют данные в формате EAN, на базе штрихкодов ITF, EAN-13, EAN-128
— для сопроводиловки (например, идентификация микросхем) — любой подходящий, но, как правило, Code39/Code93.
— управляющие штрихкоды (использовать сканер вместо клавиатуры, может быть, ты видел в крутых магазинах) — Code-128

C> А по каким признакам можно эти виды штрих кодов идентифицировать? Может по кол-ву цифп или еще по чему-нибудь?


EAN-13 — самый популярный торговый штрих-код — для идентификации марки товара.
 ||||||||||||||||||   12345
 ||||||||||||||||||   |||||
 ||      ||      ||   |||||
4  607006  915190  >

     это EAN-13       а это - его расширение (2 или 5 цифр)

Иногда закрывающий > не рисуют.
Американская версия — UPC-A — первая цифра отсутствует (подразумевается 0).
В этом же семействе есть другие штрих-коды, отличающиеся числом цифр (EAN-8 — 8, UPC-E — 6 или 7).
Штрихи и пробелы имеют 4 толщины (1:2:3:4)

ITF — чисто цифровой штрихкод, используется в логистике (Serial Ship Container Code -14, -18) и просто для цифровой информации.
######################    ######################    
#   ||||||||||||||   #        ||||||||||||||        ||||||||||||||
# H |||||||||||||| H #        ||||||||||||||        ||||||||||||||
#   ||||||||||||||   #        ||||||||||||||        ||||||||||||||
######################    ######################
    12345678901234            12345678901234        12345678901234

рис.1. Код в рамке        рис.2. Код в направляющих

Характерный вид рис.1 и рис.2, но необязательно.
Четное число цифр. На каждую пару цифр — 5 штрихов и 5 пробелов, плюс 4 черных штриха. Все штрихи и пробелы имеют две толщины (1:2 ... 1:3)

Codabar
Штрихи и пробелы имеют 2 толщины. Код содержит цифры, знаки $/*: и начинается и заканчивается буквами A|B|C|D.

Code-39, Code-93
Также 2 толщины. Цифры, буквы, знаки препинания. Как правило, код начинается и заканчивается знаками * или $.

EAN-128 — универсальный штрихкод для логистики. В одном штрихкоде могут содержаться несколько полей (например, EAN-код товара, код страны доставки и т.д.)
4 толщины. Характерная форма записи: (00)12345678901234(10)HELLO — (тип)значение(тип)значение.

2-мерные штрихкоды:

PDF-417 — 2-мерный штрихкод. См. винные акцизные марки Российской Федерации.
#||#|#|#|#|#||#
#|||#|##||#|||#
#||||#|#|||#||#
#||##|#|##|#||#
#||#||#|#||#||#

Вмещает около килобайта информации. Есть несколько разновидностей (микро-PDF не имеет правого бордюра).

DataMatrix
# # # # #
#....... 
#.......#
#....... 
#.......#
#########

# # # # ## # # # #
#....... #....... 
#.......##.......#
#....... #....... 
#.......##.......#
##################
# # # # ## # # # #
#....... #....... 
#.......##.......#
#....... #....... 
#.......##.......#
##################

Прямоугольник с такой рамочкой (иногда состыковывают несколько таких блоков).



В сети много ссылок на коммерческие и халявные программы генерации штрих-кодов. В том числе компоненты для Дельфи и Бейсика.

Как правило, документация по стандартам (!) является коммерческой тайной и продается за деньги. Но если поискать... то можно и найти

Для штрихкода важным является
— алгоритм валидации данных и расчета контрольной суммы
— алгоритм кодирования
— стандартные размеры
— требования к качеству (понятно, что неразборчиво напечатанный штрихкод не воспримется сканером)

Свои модули прислать не могу — это принадлежность фирмы. А вот доброе слово — пожалуйста.
Перекуём баги на фичи!
Re[4]: Алгоритм преобразования цифр в шрих код
От: chico97  
Дата: 22.10.02 06:16
Оценка:
Здравствуйте Кодт, Вы писали:

<Оверквотинг удалён модератором.>

Спасибо большое. буду разбираться.
Re[4]: Алгоритм преобразования цифр в шрих код
От: chico97  
Дата: 22.10.02 10:38
Оценка:
Здравствуйте Кодт, Вы писали:

К>А для чего им вообще захотелось штрихкоды лепить? Для понтов, что ли?

задача следующая:
на склад приходит оборудование в коробке (со шрих кодом). менеджеры могут продать оборудование целиком — в данном случае проблем нет. но они могут что-нибудь от туда вытащить или что-нибудь вставить. в данном случае при отправке такой коробки хорошо было бы что бы на коробке были нанесены штрих код оборудования в базовой комплектации плюс шрих коды дополнительно установленных опшенов.
соответственно при выписке счета должно генериться и распечатываться лейбл к этой коробке что бы затем при отгрузке на складе этти штрих коды считывались и шел рекорд в базу.
вообщем все довольно-таки тривиально. но нужен алгоритм для превращения цифр в бары. имеется ввиду какая цифра соответсвует какой комбинации баров (это конечно в упрощеном виде).

К>Штрихкод применяют

К>- для автоматизации складского учета
К>- — по марке товара — тогда используют стандартные, напр., EAN-13 (большинство товаров уже промаркировано)
скорее всего этот вариант.
К>В сети много ссылок на коммерческие и халявные программы генерации штрих-кодов. В том числе компоненты для Дельфи и Бейсика.

К>Как правило, документация по стандартам (!) является коммерческой тайной и продается за деньги. Но если поискать... то можно и найти


К>Для штрихкода важным является

К>- алгоритм валидации данных и расчета контрольной суммы
К>- алгоритм кодирования
К>- стандартные размеры
К>- требования к качеству (понятно, что неразборчиво напечатанный штрихкод не воспримется сканером)
а ты занимался разработкой шрифтов для этих самых штрих-кодов?
Re[5]: Алгоритм преобразования цифр в шрих код
От: Кодт Россия  
Дата: 22.10.02 11:58
Оценка: 3 (1)
Здравствуйте chico97, Вы писали:

C>задача следующая:

C>на склад приходит оборудование в коробке (со шрих кодом). менеджеры могут продать оборудование целиком — в данном случае проблем нет. но они могут что-нибудь от туда вытащить или что-нибудь вставить. в данном случае при отправке такой коробки хорошо было бы что бы на коробке были нанесены штрих код оборудования в базовой комплектации плюс шрих коды дополнительно установленных опшенов.
C>соответственно при выписке счета должно генериться и распечатываться лейбл к этой коробке что бы затем при отгрузке на складе этти штрих коды считывались и шел рекорд в базу.
C>вообщем все довольно-таки тривиально. но нужен алгоритм для превращения цифр в бары. имеется ввиду какая цифра соответсвует какой комбинации баров (это конечно в упрощеном виде).

Давай пока абстрагируемся от способа рисования штрихкода.

Сразу сделаю одно замечание. Штрих-кодированная информация стандартизируется — не только по форме штрихкода, но и по содержанию.
Например, коды EAN-13 подлежат регистрации. Ты, наверное, знаешь, что первые 2-3 цифры идентифицируют страну производителя? Здесь отсебятины быть не должно.
Библиотечный индекс ISBN также изображается штрихкодом EAN-13 или EAN-128.

1. Что хотим написать? Код базового комплекта + коды опций. Просто множество отметок на коробке или некий единый блок? Есть ли сопроводительная информация?
2. Стандартизирована ли эта информация? Например, каждый элемент был промаркирован производителем с помощью EAN-13. Или же это внутренние коды вашей складской базы данных?
3. Есть ли требования и ограничения со стороны считывающего оборудования? В принципе, сканер — всеяден. Но данные от него идут к программе. И если на входе будет смесь из стандартизованных товарных кодов EAN-13, внутренних кодов (индексов БД) и еще чего-то, то сможет ли программа это обработать? Написанная тобой — да. А та, которая реально стоит?

К>>Штрихкод применяют

К>>- для автоматизации складского учета
К>>- — по марке товара — тогда используют стандартные, напр., EAN-13 (большинство товаров уже промаркировано)
C>скорее всего этот вариант.

Если все комплекты и опции имеют свой идентификатор EAN-13 — то все окей.

C>а ты занимался разработкой шрифтов для этих самых штрих-кодов?

Шрифтами — нет

Кстати, штрихкод EAN-13 с помощью шрифта не выведешь: там достаточно затейливое кодирование. Первая цифра определяет, какие коды будут использоваться для остальных 12.

Я предпочитаю такую цепочку:
строка (без контрольной цифры) -> строка с контрольной цифрой -> строка на "алфавите" штрихкода (внутренние индексы символов) -> зебра (строка ширин пробелов и штрихов) -> рисование штрихкода прямоугольниками.

Чуть погодя напишу тебе кодер для EAN-13.
Перекуём баги на фичи!
Re[6]: Алгоритм преобразования цифр в шрих код
От: chico97  
Дата: 22.10.02 13:28
Оценка:
Здравствуйте Кодт, Вы писали:

К>1. Что хотим написать? Код базового комплекта + коды опций. Просто множество отметок на коробке или некий единый блок? Есть ли сопроводительная информация?

на коробке должны быть штрих коды базового комплекта и плюс
штрих код на каждый вид опции и что бы в этом шрих коде была зашита инфа о кол-ве опций данного вида.
К>2. Стандартизирована ли эта информация? Например, каждый элемент был промаркирован производителем с помощью EAN-13. Или же это внутренние коды вашей складской базы данных?
все промаркировано производителем. но производители разные. как узнать применяют ли они один и тот же вид маркировки или разный?
К>3. Есть ли требования и ограничения со стороны считывающего оборудования? В принципе, сканер — всеяден. Но данные от него идут к программе. И если на входе будет смесь из стандартизованных товарных кодов EAN-13, внутренних кодов (индексов БД) и еще чего-то, то сможет ли программа это обработать? Написанная тобой — да. А та, которая реально стоит?
а можно ли эту прогу заменить на свою?
Re: Расчет контрольной цифры
От: Кодт Россия  
Дата: 22.10.02 13:47
Оценка: 6 (1)
Для EAN-13 и вообще многих штрихкодов

(постепенно раскрываю тайны штрихкода EAN-13)

Условное название "взвешивание 3:1, дополнение"
char CheckDigit(char* str)
{
  int len = strlen(str);
  assert(len == 12); // для EAN-13

  int sum = 0; // контрольная сумма

  int i;
  for(i = 1; i <= len; i++)
  {
    char c = str[len-i]; // отсчет идет с конца!!!
    assert(c >= '0' && c <= '9');

    int v = с - '0';

    if(i % 2) // цифры в нечетных позициях
      v *= 3;

    sum += v;
  }

  // от полученной суммы берется дополнение по модулю 10
  sum %= 10;
  if(sum)
    sum = 10-sum;

  return '0'+sum;
}
Перекуём баги на фичи!
Re: Кодирование EAN-13
От: Кодт Россия  
Дата: 22.10.02 15:00
Оценка:
Каждая цифра в штрихкоде представляется 2 штрихами и 2 пробелами с толщиной 1..4 условных единицы — "модуля" (подробнее о габаритах я расскажу позже). Суммарная ширина зебры для одной цифры — 7 модулей.
Есть одно маленькое "но". Первая цифра не отображается, а влияет на выбор кода для оставшихся 12 цифр.

const n_separator_items = 4; // два тонких длинных штриха - в начале, середине и конце
const n_digit_items = 4;
const n_barcode_blocks = 12; // исключая первую, "мета-цифру"

const n_barcode_items = n_barcode_blocks * n_digit_items + 3 * n_separator_items - 1;

// для удобства будем пользоваться строками с 0 на конце

// b - black - штрих, w - white - пробел
#define DIGIT(b1,w1,b2,w2) { b1,w1,b2,w2, 0 }

const char* const // тонкие длинные штрихи
  separator12 = { 1,1,1,1, 0 }, // начало и середина
  separator3  = { 1,1,1,   0 }, // последний пробел не нужен!

const char* const
  ean13_subset_a[10] =
  {
    DIGIT(3,2,1,1), // 0
    DIGIT(2,2,3,1), // 1
    DIGIT(2,1,2,2), // 2
    DIGIT(1,4,1,1), // 3
    DIGIT(1,1,3,2), // 4
    DIGIT(1,2,3,1), // 5
    DIGIT(1,1,1,4), // 6
    DIGIT(1,3,1,2), // 7
    DIGIT(1,2,1,3), // 8
    DIGIT(3,1,1,2), // 9
  },
  ean13_subset_b[10] =
  {
    DIGIT(1,1,2,3), // 0
    DIGIT(1,2,2,2), // 1
    DIGIT(2,2,1,2), // 2
    DIGIT(1,1,4,1), // 3
    DIGIT(2,3,1,1), // 4
    DIGIT(1,3,1,1), // 5
    DIGIT(4,1,1,1), // 6
    DIGIT(2,1,3,1), // 7
    DIGIT(3,1,2,1), // 8
    DIGIT(2,1,1,3), // 9
  }
;
const char* const* const ean13_subsets[3] =
{ NULL, ean13_subset_a, ean13_subset_b }; // для удобства - нумерация будет с 1, поэтому [0]=NULL

#define SELECT(a,b,c,d,e,f) { a,b,c,d,e,f, 0 }
const char* const ean13_subset_selector[10]
{
  SELECT(2,2,2,1,1,1), // 0
  SELECT(2,2,1,2,1,1), // 1
  SELECT(2,2,1,1,2,1), // 2
  SELECT(2,2,1,1,1,2), // 3
  SELECT(2,1,2,2,1,1), // 4
  SELECT(2,1,1,2,2,1), // 5
  SELECT(2,1,1,1,2,2), // 6
  SELECT(2,1,2,1,2,1), // 7
  SELECT(2,1,2,1,1,2), // 8
  SELECT(2,1,1,2,1,2), // 9
};

void MakeZebraEAN13(const char* str, char* zebra) // размер zebra = n_barcode_items + 1
{
  assert(str);
  assert(strlen(str) == 13);
  assert(zebra);

  int i;

  // селектор
  assert(isdigit(str[0]));
  const char* selector = ean13_subset_selector[ str[0]-'0' ];

  // начало
  strcpy(zebra, separator12); zebra += n_separator_items;

  // первая шестерка
  for(i = 1; i < 7; i++)
  {
    assert(isdigit(str[i]));

    const char* const* subset = ean13_subsets[ selector[i-1] ];
    const char* digit = subset[ str[i]-'0' ];

    strcpy(zebra, digit); zebra += n_digit_items;
  }

  // середина
  strcpy(zebra, separator12); zebra += n_separator_items;

  // вторая шестерка
  for(i = 7; i < 13; i++)
  {
    assert(isdigit(str[i]));

    const char* const* subset = ean13_subsets[ selector[i-7] ];
    const char* digit = subset[ str[i]-'0' ];

    strcpy(zebra, digit); zebra += n_digit_items;
  }

  // конец
  strcpy(zebra, separator3);
}

Примечание 1. На самом деле ширина штрихов и пробелов не равна целому числу модулей — это делается для лучшей помехозащиты. Но на это можно болт забить (что и сделано в приведенном коде).
К сожалению, в исходной программе болт не был забит, поэтому пришлось "переводить". Если не компилится — не обессудь, поправь.

Примечание 2. У штрихкода слева и справа от "зебры" есть т.н. зоны стабилизации (обязательно должны быть белыми). Без них сканер не сможет найти границы штрихкода.
Но об этом — в следующий раз (вероятно, послезавтра).

Примечание 3. "Ножки" (длинные штрихи), правильное расположение и правильный шрифт цифр (да-да! это все нормируется) для внутреннего использования можно проигнорировать.
Т.е. выводить штрихкод можно по-простому:
|||||||||||||    ||||||||||||||||||
|||||||||||||    ||||||||||||||||||
|||||||||||||    ||      ||      ||
1234567890123   1  234567  890123  >

 по-простому        по стандарту

Все! Теперь у тебя достаточно информации, чтобы рисовать EAN-13 для внутреннего использования.

Кстати, можно коды опций делать заведомо за пределами реестра EAN — например, первые 6 цифр — нули (ну и фиг с ними, американцами).
Или начинать с 999 — тоже неиспользуемая комбинация. Сканеру-то все равно
Перекуём баги на фичи!
Re: Напутствие
От: Кодт Россия  
Дата: 22.10.02 15:33
Оценка:
Когда будешь тестировать вывод штрихкода, обязательно "потренируйся на кошках".

Возьми образец (с пивной банки ), рассчитай для него контрольную сумму, зебру, выведи и сравни с оригиналом.

Если что-то где-то не совпало, и это не твой баг — то обязательно напиши (мало ли, я напутал в листингах).

Наверное, скажу все же о размерах (самых важных).

Зоны стабилизации слева и справа — не менее 11 модулей, сверху и снизу — не менее 1 модуля.
Высота штрихов — не менее 10 модулей (это очень, очень узкая полоска), рекомендуемая — 70.
Перекуём баги на фичи!
Re: Алгоритм преобразования цифр в шрих код
От: Хитрик Денис Россия RSDN
Дата: 22.10.02 17:26
Оценка: 40 (4)
Здравствуйте chico97, Вы писали:

C>есть ли стандартизованный алгоритм преобразования цифр в знаки шрих полосок или что-то в этом роде. просто нуно генерить шрих код изображение из цифр кода.


Есть ещё сайт про штриховое кодирование http://www.sbarcode.com/
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[2]: Кодирование EAN-13
От: chico97  
Дата: 23.10.02 06:09
Оценка:
Здравствуйте Кодт, Вы писали:

К>Каждая цифра в штрихкоде представляется 2 штрихами и 2 пробелами с толщиной 1..4 условных единицы — "модуля" (подробнее о габаритах я расскажу позже). Суммарная ширина зебры для одной цифры — 7 модулей.

К>Есть одно маленькое "но". Первая цифра не отображается, а влияет на выбор кода для оставшихся 12 цифр.

К>
К>const n_separator_items = 4; // два тонких длинных штриха - в начале, середине и конце
К>const n_digit_items = 4;
К>const n_barcode_blocks = 12; // исключая первую, "мета-цифру"

К>const n_barcode_items = n_barcode_blocks * n_digit_items + 3 * n_separator_items - 1;

К>// для удобства будем пользоваться строками с 0 на конце

К>// b - black - штрих, w - white - пробел
К>#define DIGIT(b1,w1,b2,w2) { b1,w1,b2,w2, 0 }

К>const char* const // тонкие длинные штрихи
К>  separator12 = { 1,1,1,1, 0 }, // начало и середина
К>  separator3  = { 1,1,1,   0 }, // последний пробел не нужен!

К>const char* const
К>  ean13_subset_a[10] =
К>  {
К>    DIGIT(3,2,1,1), // 0
К>    DIGIT(2,2,3,1), // 1
К>    DIGIT(2,1,2,2), // 2
К>    DIGIT(1,4,1,1), // 3
К>    DIGIT(1,1,3,2), // 4
К>    DIGIT(1,2,3,1), // 5
К>    DIGIT(1,1,1,4), // 6
К>    DIGIT(1,3,1,2), // 7
К>    DIGIT(1,2,1,3), // 8
К>    DIGIT(3,1,1,2), // 9
К>  },
К>  ean13_subset_b[10] =
К>  {
К>    DIGIT(1,1,2,3), // 0
К>    DIGIT(1,2,2,2), // 1
К>    DIGIT(2,2,1,2), // 2
К>    DIGIT(1,1,4,1), // 3
К>    DIGIT(2,3,1,1), // 4
К>    DIGIT(1,3,1,1), // 5
К>    DIGIT(4,1,1,1), // 6
К>    DIGIT(2,1,3,1), // 7
К>    DIGIT(3,1,2,1), // 8
К>    DIGIT(2,1,1,3), // 9
К>  }
К>;
К>const char* const* const ean13_subsets[3] =
К>{ NULL, ean13_subset_a, ean13_subset_b }; // для удобства - нумерация будет с 1, поэтому [0]=NULL

К>#define SELECT(a,b,c,d,e,f) { a,b,c,d,e,f, 0 }
К>const char* const ean13_subset_selector[10]
К>{
К>  SELECT(2,2,2,1,1,1), // 0
К>  SELECT(2,2,1,2,1,1), // 1
К>  SELECT(2,2,1,1,2,1), // 2
К>  SELECT(2,2,1,1,1,2), // 3
К>  SELECT(2,1,2,2,1,1), // 4
К>  SELECT(2,1,1,2,2,1), // 5
К>  SELECT(2,1,1,1,2,2), // 6
К>  SELECT(2,1,2,1,2,1), // 7
К>  SELECT(2,1,2,1,1,2), // 8
К>  SELECT(2,1,1,2,1,2), // 9
К>};

К>void MakeZebraEAN13(const char* str, char* zebra) // размер zebra = n_barcode_items + 1
К>{
К>  assert(str);
К>  assert(strlen(str) == 13);
К>  assert(zebra);

К>  int i;

К>  // селектор
К>  assert(isdigit(str[0]));
К>  const char* selector = ean13_subset_selector[ str[0]-'0' ];

К>  // начало
К>  strcpy(zebra, separator12); zebra += n_separator_items;

К>  // первая шестерка
К>  for(i = 1; i < 7; i++)
К>  {
К>    assert(isdigit(str[i]));

К>    const char* const* subset = ean13_subsets[ selector[i-1] ];
К>    const char* digit = subset[ str[i]-'0' ];

К>    strcpy(zebra, digit); zebra += n_digit_items;
К>  }

К>  // середина
К>  strcpy(zebra, separator12); zebra += n_separator_items;

К>  // вторая шестерка
К>  for(i = 7; i < 13; i++)
К>  {
К>    assert(isdigit(str[i]));

К>    const char* const* subset = ean13_subsets[ selector[i-7] ];
К>    const char* digit = subset[ str[i]-'0' ];

К>    strcpy(zebra, digit); zebra += n_digit_items;
К>  }

К>  // конец
К>  strcpy(zebra, separator3);
К>}
К>

К>Примечание 1. На самом деле ширина штрихов и пробелов не равна целому числу модулей — это делается для лучшей помехозащиты. Но на это можно болт забить (что и сделано в приведенном коде).
К>К сожалению, в исходной программе болт не был забит, поэтому пришлось "переводить". Если не компилится — не обессудь, поправь.

К>Примечание 2. У штрихкода слева и справа от "зебры" есть т.н. зоны стабилизации (обязательно должны быть белыми). Без них сканер не сможет найти границы штрихкода.

К>Но об этом — в следующий раз (вероятно, послезавтра).

К>Примечание 3. "Ножки" (длинные штрихи), правильное расположение и правильный шрифт цифр (да-да! это все нормируется) для внутреннего использования можно проигнорировать.

К>Т.е. выводить штрихкод можно по-простому:
К>
К>|||||||||||||    ||||||||||||||||||
К>|||||||||||||    ||||||||||||||||||
К>|||||||||||||    ||      ||      ||
К>1234567890123   1  234567  890123  >

К> по-простому        по стандарту
К>

К>Все! Теперь у тебя достаточно информации, чтобы рисовать EAN-13 для внутреннего использования.

К>Кстати, можно коды опций делать заведомо за пределами реестра EAN — например, первые 6 цифр — нули (ну и фиг с ними, американцами).

К>Или начинать с 999 — тоже неиспользуемая комбинация. Сканеру-то все равно

Спасибо за пояснения и пример кода. правда я на С++ никогда не писал, но думаю разберусь (перешел с VB на .NET Framework) .
Re[2]: Алгоритм преобразования цифр в шрих код
От: Кодт Россия  
Дата: 24.10.02 08:17
Оценка:
Здравствуйте Хитрик Денис, Вы писали:

ХД>Есть ещё сайт про штриховое кодирование http://www.sbarcode.com/


Где ты был 5 лет назад!!! УУУУУУ!
Перекуём баги на фичи!
Re[3]: Алгоритм преобразования цифр в шрих код
От: Хитрик Денис Россия RSDN
Дата: 24.10.02 08:22
Оценка:
Здравствуйте Кодт, Вы писали:

ХД>>Есть ещё сайт про штриховое кодирование http://www.sbarcode.com/

К>Где ты был 5 лет назад!!! УУУУУУ!

5 лет назад я учился в школе!
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[2]: Кодирование EAN-13
От: Кодт Россия  
Дата: 24.10.02 08:28
Оценка:
Здравствуйте Кодт, Вы писали:

К>Каждая цифра в штрихкоде представляется 2 штрихами и 2 пробелами с толщиной 1..4 условных единицы — "модуля" (подробнее о габаритах я расскажу позже). Суммарная ширина зебры для одной цифры — 7 модулей.

К>Есть одно маленькое "но". Первая цифра не отображается, а влияет на выбор кода для оставшихся 12 цифр.

Конечно же, по пьяни напутал.
Обязательно смотри на ссылку Дениса Хитрика: http://www.sbarcode.com/encoding/ean13.shtml

К>
К>const n_separator1_items = 3, n_separator2_items = 5, n_separator3_items = 3;
К>const n_digit_items = 4;
К>const n_barcode_blocks = 12; // исключая первую, "мета-цифру"

К>const n_barcode_items = n_barcode_blocks * n_digit_items
                          + n_separator1_items + n_separator2_items + n_separator3_items;

К>// для удобства будем пользоваться строками с 0 на конце

К>// b - black - штрих, w - white - пробел
К>#define DIGIT(b1,w1,b2,w2) { b1,w1,b2,w2, 0 }

К>const char* const // тонкие длинные штрихи
К>  separator1 = { 1,1,1,   0 }, // начало
    separator2 = { 1,1,1,1,1, 0 }, // середина
К>  separator3 = { 1,1,1,     0 }, // конец

К>const char* const
К>  ean13_subset_a[10] =
К>  {
К>    DIGIT(3,2,1,1), // 0
К>    DIGIT(2,2,3,1), // 1
К>    DIGIT(2,1,2,2), // 2
К>    DIGIT(1,4,1,1), // 3
К>    DIGIT(1,1,3,2), // 4
К>    DIGIT(1,2,3,1), // 5
К>    DIGIT(1,1,1,4), // 6
К>    DIGIT(1,3,1,2), // 7
К>    DIGIT(1,2,1,3), // 8
К>    DIGIT(3,1,1,2), // 9
К>  },
К>  ean13_subset_b[10] =
К>  {
К>    DIGIT(1,1,2,3), // 0
К>    DIGIT(1,2,2,2), // 1
К>    DIGIT(2,2,1,2), // 2
К>    DIGIT(1,1,4,1), // 3
К>    DIGIT(2,3,1,1), // 4
К>    DIGIT(1,3,1,1), // 5
К>    DIGIT(4,1,1,1), // 6
К>    DIGIT(2,1,3,1), // 7
К>    DIGIT(3,1,2,1), // 8
К>    DIGIT(2,1,1,3), // 9
К>  }
К>;
К>const char* const* const ean13_subsets[3] =
К>{ NULL, ean13_subset_a, ean13_subset_b }; // для удобства - нумерация будет с 1, поэтому [0]=NULL

К>#define SELECT(a,b,c,d,e,f) { a,b,c,d,e,f, 0 }
К>const char* const ean13_subset_selector[10]
К>{
К>  SELECT(2,2,2,1,1,1), // 0
К>  SELECT(2,2,1,2,1,1), // 1
К>  SELECT(2,2,1,1,2,1), // 2
К>  SELECT(2,2,1,1,1,2), // 3
К>  SELECT(2,1,2,2,1,1), // 4
К>  SELECT(2,1,1,2,2,1), // 5
К>  SELECT(2,1,1,1,2,2), // 6
К>  SELECT(2,1,2,1,2,1), // 7
К>  SELECT(2,1,2,1,1,2), // 8
К>  SELECT(2,1,1,2,1,2), // 9
К>};

К>void MakeZebraEAN13(const char* str, char* zebra) // размер zebra = n_barcode_items + 1
К>{
К>  assert(str);
К>  assert(strlen(str) == 13);
К>  assert(zebra);

К>  int i;

К>  // селектор
К>  assert(isdigit(str[0]));
К>  const char* selector = ean13_subset_selector[ str[0]-'0' ];

К>  // начало
К>  strcpy(zebra, separator1); zebra += n_separator1_items;

К>  // первая шестерка
К>  for(i = 1; i < 7; i++)
К>  {
К>    assert(isdigit(str[i]));

К>    const char* const* subset = ean13_subsets[ selector[i-1] ];
К>    const char* digit = subset[ str[i]-'0' ];

К>    strcpy(zebra, digit); zebra += n_digit_items;
К>  }

К>  // середина
К>  strcpy(zebra, separator2); zebra += n_separator2_items;

    const char* const* subset = ean13_subsets[ 0 ];

К>  // вторая шестерка
К>  for(i = 7; i < 13; i++)
К>  {
К>    assert(isdigit(str[i]));

К>    const char* digit = subset[ str[i]-'0' ];

К>    strcpy(zebra, digit); zebra += n_digit_items;
К>  }

К>  // конец
К>  strcpy(zebra, separator3);
К>}
К>


Структура строки "zebra" :
ширина-штриха ширина-пробела ширина-штриха ширина-пробела ..... ширина-штриха
Перекуём баги на фичи!
Re[7]: Алгоритм преобразования цифр в шрих код
От: Кодт Россия  
Дата: 24.10.02 11:18
Оценка:
Здравствуйте chico97, Вы писали:

C>Здравствуйте Кодт, Вы писали:


К>>1. Что хотим написать? Код базового комплекта + коды опций. Просто множество отметок на коробке или некий единый блок? Есть ли сопроводительная информация?

C>на коробке должны быть штрих коды базового комплекта и плюс
C>штрих код на каждый вид опции и что бы в этом шрих коде была зашита инфа о кол-ве опций данного вида.

Именно о количестве опций данного вида?
Тогда напрашивается стандарт EAN-128 на базе штрихкодов EAN-13, Code-128, ITF.

К>>2. Стандартизирована ли эта информация? Например, каждый элемент был промаркирован производителем с помощью EAN-13. Или же это внутренние коды вашей складской базы данных?

C>все промаркировано производителем. но производители разные. как узнать применяют ли они один и тот же вид маркировки или разный?

Если они придерживаются стандарта EAN, то спектр проблем уменьшается.

К>>3. Есть ли требования и ограничения со стороны считывающего оборудования? В принципе, сканер — всеяден. Но данные от него идут к программе. И если на входе будет смесь из стандартизованных товарных кодов EAN-13, внутренних кодов (индексов БД) и еще чего-то, то сможет ли программа это обработать? Написанная тобой — да. А та, которая реально стоит?

C>а можно ли эту прогу заменить на свою?

А это зависит от того, в чьем ведении рабочее место приемщика.


Для идентификации продукта EAN/UCC рекомендует использовать EAN-13, ITF 14 цифр, EAN-128 с AI (application ID) (01).
Для указания количества — EAN-128 с AI (30).
Для идентификации компонента — AI (02) или (8006).
(www.ean.ru/sscc/sscc.htm)

Предположим для простоты, что базовые комплекты и штучные опции (которые по 1 на комплект) кодируются EAN-13 | ITF-14 (там добавляется 0 спереди).
Если опция присутствует в количестве N штук, то либо лепить N штрихкодов, либо EAN-128 с данными (01)идентификатор(30)количество

EAN-128 кодируется с помощью штрихкода Code-128:
F 02 0ppppppppppppp F 30 nn..n
     --------------      -----
         14 цифр         2..8 цифр

где F — спецсимвол "FNC1", p...p — код продукта EAN-13 (включая контрольную цифру), n..n — количество (лучше, если количество цифр будет четным).

Сканер будет считывать 13, 14 цифр либо пачку из 20..26 цифр с разделителем.

Для завершения ввода серии штрихкодов можно напечатать какой-нибудь маленький штрихкод без особого смысла, например AI (99) — произвольный текст.

Итого,
на коробке будут
EAN-13 основного комплекта,
EAN-13 | EAN-128 опций — (02)0ppppppppppppp(30)nn
EAN-128 завершения — (99)
Перекуём баги на фичи!
Re[2]: Алгоритм преобразования цифр в шрих код
От: Dima2  
Дата: 28.10.02 07:19
Оценка:
Здравствуйте Хитрик Денис, Вы писали:

ХД>Есть ещё сайт про штриховое кодирование http://www.sbarcode.com/


Спасибо, что хоть один человек вспомнил
Re: Алгоритм преобразования цифр в шрих код
От: Аноним  
Дата: 13.11.03 11:55
Оценка:
Здравствуйте, chico97, Вы писали:

C>Уважаемые,

C>есть ли стандартизованный алгоритм преобразования цифр в знаки шрих полосок или что-то в этом роде. просто нуно генерить шрих код изображение из цифр кода.

А мине нуна нормально работающая компонента...главное чтобы с EAN 128 нормально выводило...а то куды ни кинься везде таньга нужна...

Да вот еще вопросик...код еан128...цыферьки его 9785272000262...а блип компоненты все почему-то теряют последнюю двойку, хоть тресни не пойму куда...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.