Na przestrzeni lat opracowano kilkadziesiąt rodzajów monochromatycznych kodów kreskowych. Niektóre z nich służą do zapisywania tylko cyfr, niektóre do znaków alfanumerycznych, a jeszcze inne pozwalają na zapis dowolnej treści. Kody różnią się między sobą sposobem oznaczania zer i jedynek, dopuszczalną długością zapisanego ciągu znaków, gęstością upakowania znaków, odpornością na błędy odczytu oraz sformalizowanymi wymaganiami, dostosowanymi do specyfiki branż, w których są stosowane. I choć niektóre z kodów zostały zaprojektowane z myślą o bardzo konkretnych aplikacjach, niejednokrotnie zdarza się, że bywają też używane w zupełnie innych przypadkach, niż planowali autorzy. To czy tak się dzieje, zależy przede wszystkim od dostępności narzędzi do kodowania i skanowania danych formatów, ale czasem też zapewne z nieświadomości inżynierów odnośnie dostępności innych standardów, bardziej adekwatnych do danego zastosowania. Niniejszy artykuł ma na celu zwiększyć świadomość polskich inżynierów w zakresie możliwości używania różnorodnych kodów kreskowych.
Najpopularniejsze kody
Chyba nie ma wątpliwości, że kodami kreskowymi, z jakimi większość ludzi spotyka się na co dzień są oznaczenia produktów sprzedawanych w sklepach. Są one drukowane w kilku formatach, których użycie zależy od regionu w którym towar został wyprodukowany oraz od wielkości produktu. W USA, Kanadzie, Wielkiej Brytanii, Australii i Nowej Zelandii powszechnie stosowany jest kod standard UPC, a np. w Europie: EAN. Oba z tych kodów występują w wersjach krótszych i dłuższych, przy czym krótsze nadrukowuje się tam, gdzie dłuższy kod by się zwyczajnie nie zmieścił: na opakowaniach gum do żucia i innych małych przedmiotach.
Kody UPC
Kody w tym formacie mogą zawierać tylko cyfry w systemie dziesiętnym. Istnieją dwie powszechnie stosowane odmiany kodów UPC (Universal Product Code): 12-cyfrowy UPC-A i 6-cyfrowy UPC-E oraz kilka mających tylko specjalistyczne zastosowanie (UPC-B, UPC-C, UPC-D, UPC-2, UPC-5, które różnią się długością i obecnością cyfry kontrolnej). Kod UPC-E z założenia ma dać się przekształcić do kodu UPC-A, poprzez dodanie w jego środkowej części określonego ciągu zer i dodatkowych cyfr, zależnych od ostatniej z cyfr w kodzie UPC-E. Kod UPC-A zawiera na swojej ostatniej pozycji cyfrę kontrolną, co oznacza, że może pomieścić 1011 (sto miliardów) wartości. Dla kodu UPC-E również jest obliczana cyfra kontrolna, ale nie jest ona zapisywana na jednej z 6 pozycji, a jedynie wpływa na sposób prezentacji kolejnych cyfr w kodzie, o czym dalej. Ponieważ ostatnia cyfra w kodzie UPC-E informuje natomiast o sposobie konwersji na UPC-A, więc jest też użyteczna, oznaczałoby to, że w UPC-E można zapisać milion kombinacji, zachowując przy tym zdolność do wykrycia 100% błędów w postaci jednej niepoprawnie odczytanej cyfry. W praktyce liczba dostępnych kombinacji jest nawet większa i wynosi 64 miliony, co wynika z faktu, że sam sposób zakodowania poszczególnych cyfr w UPC-E też ma znaczenie. To jeden z najbardziej skomplikowanych systemów kodowania w kodach jednowymiarowych.
Sposób druku kodu UPC-A nie jest trywialny. Cyfry podzielone są na dwa bloki, po 6 cyfr każdy. Pomiędzy tymi blokami umieszczony jest znak środka, który nie reprezentuje żadnej liczby. Na krańcach kodu znajdują się identyczne znaki startu/stopu, które również nie reprezentują żadnej liczby, a jedynie, wraz ze znakiem środka, wskazują czytnikowi początek, środek i koniec kodu, ułatwiając analizę obrazu. Aby umożliwić poprawny odczyt kodu, na zewnątrz znaków startu i stopu muszą znaleźć się odpowiednio szerokie strefy czyste (quiet zones), dzięki którym obrazy znajdujące się naokoło kodu nie będą traktowane jako jego fragmenty.
Same cyfry zakodowane są za pomocą 7 przylegających do siebie, cienkich czarnych lub białych pasków dla każdej z nich. Jak łatwo policzyć, 7 pasków, które mogą przyjąć tylko jeden z dwóch kolorów (biały lub czarny) skutkuje powstaniem 27, czyli 128 kombinacji, które wykorzystywane są do zapisu tylko 10 różnych cyfr. Nie jest to bynajmniej przeoczenie, a celowy zabieg, zwiększający poprawność odczytu. Każda cyfra musi być zakodowana z użyciem 7 pasków, które przez to, że nie ma pomiędzy nimi odstępów, mogą się ze sobą zlewać, tworząc wizualnie paski o grubości równej wielokrotności pojedynczego paska. Co więcej wprowadzono też regułę, że wizualnie, każda cyfra może być reprezentowana jedynie za pomocą dwóch białych i dwóch czarnych pasków, co oznacza, że maksymalna grubość takiego połączonego paska(czy to czarnego, czy białego), może być równa czterokrotnej grubości paska pojedynczego. Wtedy to, z konieczności zmieszczenia się w bloku o szerokości 7 pojedynczych pasków, pozostałe trzy paski muszą mieć szerokość pojedynczą (każdy). W efekcie dostępne jest tylko osiem kombinacji, w których pojawia się biały lub czarny pasek o wizualnej grubości czterech pojedynczych pasków, osiem kombinacji, w których jest tylko jeden pasek pojedynczych rozmiarów i trzy paski podwójnych rozmiarów oraz 24 kombinacje z dwoma paskami o grubości pojedynczej, jednym podwójnym i jednym potrójnym. Razem daje to już tylko 40, a nie 128 dopuszczalnych kombinacji! Ale to nie wszystko. Połowa z tych kombinacji zaczyna się od paska białego, kończąc na czarnym, a połowa od czarnego, a kończąc na białym (co wynika z faktu, że każda kombinacja składa się wizualnie z czterech pasków, a więc z parzystej ich liczby). Gdyby zestawić obok siebie dwie cyfry, z których jedna byłaby zakodowana z użyciem kombinacji zaczynającej się od paska białego, a druga od czarnego, to ponieważ pomiędzy kodami dla poszczególnych cyfr nie ma odstępów, ostatni pasek pierwszej cyfry byłby czarny i zlewałby się z pierwszym, czarnym paskiem drugiej cyfry. Znacznie zwiększyłoby to trudność odczytu, gdyż w najgorszym wypadku prowadziłoby to do zlania się ze sobą 8 pojedynczych pasków, których odróżnienie np. od 7 zlanych ze sobą pasków wymagałoby dużo większej precyzji niż odróżnienie zlanych ze sobą 3 i 4 pasków. Wszak pasek o grubości 8-krotności paska pojedynczego różni się od paska o grubości 7-krotności paska pojedynczego tylko o 12,5%, podczas gdy paski pasek poczwórny od potrójnego o 25%, co pozwala dopuścić mniejszą precyzję pomiaru szerokości pasków.
Oczywiście pod warunkiem, że skaner jest w ogóle w stanie wykryć pasek pojedynczej grubości, co jednak jest w praktyce zadaniem łatwiejszym niż rozróżnienie paska 7-krotnego od 8-krotnego.
W związku z powyższym, aby uniknąć tych problemów, inżynierowie tworzący kod UPC uznali, że skoro dostępna liczba kombinacji przy ustalonych wcześniej zasadach wynosi 40, a do zakodowania cyfr dziesiętnych wystarczy tylko 10, można swobodnie odrzucić połowę z nich, tych zaczynających się od paska czarnego, zwiększając tym samym pewność odczytu kodu. Jednakże zrezygnowanie z wykorzystania 10 z pozostałych 20 dopuszczalnych kombinacji byłoby zwykłym marnotrawstwem, w związku z tym podjęto jeszcze jedną decyzję, ułatwiającą wykrywanie błędów podczas skanowania: ustalono, że suma grubości (liczonych jako wielokrotności grubości paska pojedynczego) czarnych pasków musi być nieparzysta, co zredukowało liczbę dopuszczalnych kombinacji do 10. Teoretycznie tak zaprojektowany kod pozwala zabezpieczyć się przed błędnym rozpoznaniem kodu odczytywanego „do góry nogami”, gdyż wszystkie cyfry muszą się zaczynać od białego, a kończyć czarnym paskiem. Uznano jednak, że to zbyt małe zabezpieczenie i zadecydowano, że cyfry znajdujące się po prawej stronie od znacznika środka będą musiały kodowane w inny sposób niż te po lewej. Wizualnie będą zakodowane w sposób odwrotny niż ten dla cyfr z lewej strony paska. Oznacza to, że cyfry po prawej zawsze zaczynają się od paska czarnego, a kończą białym oraz że suma grubości czarnych pasków po prawej (liczona tak samo jak po lewej) stronie od środka będzie dla każdej z cyfr parzysta.