Генерация и декодирование штрих-кода

Автор
avatar-yurevyurev
Notebook

Генерация и декодирование штрих-кода

В этом материале мы подробно разберем возможности преобразования строки символов в черно-белый штрих-код (в виде изображения) и обратно. Код использует пакет Images для работы с изображениями.

Реализованная нами программа состоит из двух основных функций:

  1. string_to_barcode – преобразует строку в изображение штрих-кода;
  2. barcode_to_string – декодирует изображение штрих-кода обратно в строку.
In [ ]:
using Images

Функция string_to_barcode

Логика работы

  1. Инициализация пустого массива bits: в нём хранятся биты всех символов строки.

  2. Цикл по каждому символу строки:

    • bitstring(UInt8(char)) преобразовывает символ в его 8-битное представление,
    • parse(Int, bit) преобразует каждый бит в соответствующее целое число,
    • append! добавляет эти числа в массив bits.
  3. Создание двумерного массива для изображения:

    • bits' транспонирует вектор бит (преобразует в строку),
    • repeat повторяет эту строку length(bits)/2 раз, чтобы создать двумерный массив (изображение), где каждая строка идентична,
    • коэффициент length(bits)/2 выбран для создания прямоугольного изображения.
  4. Возврат результата: функция возвращает двумерный массив из 0 и 1, который можно интерпретировать как черно-белое изображение.

In [ ]:
function string_to_barcode(s::String)
    bits = []
    for char in s
        binary_str = bitstring(UInt8(char)) # Получаем бинарное представление символа (8 бит)
        append!(bits, [parse(Int, bit) for bit in binary_str]) # Преобразуем каждый бит в число и добавляем в вектор
    end
    repeated_bits = repeat(bits', Int.(length(bits)/2),1) # Повторяем вектор бит
    return repeated_bits
end
Out[0]:
string_to_barcode (generic function with 1 method)

Пример использования:

In [ ]:
barcode = string_to_barcode("_Engee_") # Переводим строку в битовое представление
img = Gray.(barcode) # Преобразуем в изображение
display(img) # Показываем изображение
save("barcode.png", img) # Сохраняем в файл
No description has been provided for this image

Функция barcode_to_string

Логика работы

  1. Бинаризация изображения:

    • Gray.(img) преобразует изображение в оттенки серого;
    • .> 0.5 преобразует в чисто черно-белое (значения больше 0.5 становятся 1, остальные – 0).
  2. Извлечение битовой последовательности:

    • binary_img[10, :] берет 10-ю строку изображения (можно любую, так как все строки одинаковы).
  3. Декодирование символов:

    • цикл проходит по битам с шагом 8 (каждый символ кодируется 8 битами),
    • для каждых 8 бит
      • reduce((x, y) -> x * 2 + y, byte) преобразует массив бит в число,
      • Char() преобразует число в соответствующий символ.
  4. Сборка строки:

    • join(chars) объединяет все символы в одну строку.
In [ ]:
function barcode_to_string(img)
    binary_img = Gray.(img) .> 0.5 # Преобразуем изображение в бинарный формат (0 или 1)
    bits = binary_img[10, :] # Получаем первую строку изображения (так как все строки одинаковы)
    # Преобразуем биты в символы
    chars = []
    for i in 1:8:length(bits)
        # Берем 8 бит и преобразуем их в символ
        byte = bits[i:i+7]
        char = Char(reduce((x, y) -> x * 2 + y, byte))
        push!(chars, char)
    end
    # Собираем символы в строку
    return join(chars)
end
Out[0]:
barcode_to_string (generic function with 1 method)

Пример использования:

In [ ]:
img = load("barcode.png") # Загружаем изображение штрихкода
display(img) # Показываем изображение
decoded_string = barcode_to_string(img) # Декодируем строку
println("Decoded string: ", decoded_string) # Выводим результат
No description has been provided for this image
Decoded string: _Engee_

Вывод

Этот код демонстрирует базовый принцип преобразования строки в визуальное представление и обратно. Этот принцип может быть расширен для более сложных сценариев использования.

Также стоит упомянуть некоторые особенности реализации.

  1. Кодирование символов: каждый символ кодируется ровно 8 битами (ASCII), что ограничивает набор символов, но упрощает реализацию.

  2. Визуальное представление: штрих-код создается повторением одной и той же битовой последовательности в нескольких строках, что делает его более заметным.

  3. Устойчивость: при декодировании берется конкретная строка изображения (10-я), что делает алгоритм уязвимым к повреждениям изображения. В реальных системах обычно используется более сложная логика восстановления.