Engee 文档
Notebook

条形码生成和解码

本文将详细介绍如何将字符串转换为黑白条形码(图像),反之亦然。代码使用Images 软件包处理图像。

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

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

字符串到条形码函数

操作逻辑

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

功能条码到字符串

操作逻辑

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.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.2. 可视表示:条形码是通过在多行中重复相同的位序列来创建的,这使得条形码更加可视。

3.稳定性:在解码过程中提取特定的图像行(第 10 行),这使得算法容易受到图像损坏的影响。在实际系统中,通常会使用更复杂的重构逻辑。