Engee 文档
Notebook

条码生成和解码

在本文中,我们将详细研究将一串字符转换为黑白条形码(作为图像)的可能性,反之亦然。 代码使用包 Images 用于处理图像。

我们实现的程序包括两个主要功能:

  1. string_to_barcode -将字符串转换为条形码图像;
  2. barcode_to_string -将条形码图像解码回字符串。
In [ ]:
using Images

String_to_barcode函数

工作的逻辑

  1. 空位数组的初始化:它存储字符串的所有字符的位。

  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个),这使得算法容易受到图像损坏的影响。 在实际系统中,通常使用更复杂的恢复逻辑。