From d7a7502d8948eed9a39cbc64fe447957295dc560 Mon Sep 17 00:00:00 2001 From: Philip Lundrigan Date: Wed, 7 Jan 2026 12:04:12 -0700 Subject: [PATCH] Start the implementation of EIC for QR codes Right now, there is a dummy implementation of EIC --- qrcode/main.py | 12 +++++++++++- qrcode/util.py | 14 ++++++++++++-- test.py | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 test.py diff --git a/qrcode/main.py b/qrcode/main.py index be62de81..4146482b 100644 --- a/qrcode/main.py +++ b/qrcode/main.py @@ -123,6 +123,7 @@ def clear(self): self.modules_count = 0 self.data_cache = None self.data_list = [] + self.eic_data = b"" def add_data(self, data, optimize=20): """ @@ -140,6 +141,15 @@ def add_data(self, data, optimize=20): self.data_list.append(util.QRData(data)) self.data_cache = None + def add_eic_data(self, data: bytes): + """ + Add Error Insertion Coding data to this QR Code. + + :param data: The EIC data as bytes. + """ + self.eic_data = data + self.data_cache = None + def make(self, fit=True): """ Compile the data into a QR Code array. @@ -178,7 +188,7 @@ def makeImpl(self, test, mask_pattern): if self.data_cache is None: self.data_cache = util.create_data( - self.version, self.error_correction, self.data_list + self.version, self.error_correction, self.data_list, self.eic_data ) self.map_data(self.data_cache, mask_pattern) diff --git a/qrcode/util.py b/qrcode/util.py index 4187aa5e..a6a723fd 100644 --- a/qrcode/util.py +++ b/qrcode/util.py @@ -552,7 +552,7 @@ def create_bytes(buffer: BitBuffer, rs_blocks: list[RSBlock]): return data -def create_data(version, error_correction, data_list): +def create_data(version, error_correction, data_list, eic_data=b""): buffer = BitBuffer() for data in data_list: buffer.put(data.mode, 4) @@ -585,4 +585,14 @@ def create_data(version, error_correction, data_list): else: buffer.put(PAD1, 8) - return create_bytes(buffer, rs_blocks) + fec_data = create_bytes(buffer, rs_blocks) + + # Add EIC data if provided + if eic_data: + # TODO: Brian: put your magical EIC data integration here + + # Naive implementation placeholder + for i, byte in enumerate(eic_data): + fec_data[i] = byte + + return fec_data diff --git a/test.py b/test.py new file mode 100644 index 00000000..07c7c4e7 --- /dev/null +++ b/test.py @@ -0,0 +1,17 @@ +import qrcode + +qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=4, +) +qr.add_data("Some data") +img = qr.make_image(fill_color="black", back_color="white") +img.save("before-eic.png") + +# Can't add too much EIC data or the QR code will get corrupted (because of my naive approach) +qr.add_eic_data(b"EIC") + +img = qr.make_image(fill_color="black", back_color="white") +img.save("after-eic.png")