Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

White lines appearing when generating codes #357

Open
UlrikRos opened this issue Feb 26, 2024 · 0 comments
Open

White lines appearing when generating codes #357

UlrikRos opened this issue Feb 26, 2024 · 0 comments

Comments

@UlrikRos
Copy link

UlrikRos commented Feb 26, 2024

I have not been able to find out why, but sometimes when I generate QR codes of a certain size and with the rounded squares I get these white lines between the cells. It only happens when I use the RoundedModuleDrawer to change the shape of the cells. Here are examples of the same QR code, just different Box_size:

Box size 23
qr_code_1

Box size 24
qr_code_1

Here are the functions I made:

    def generate_qr_code(self):
        text = self.input_box.toPlainText()
        save_path = self.save_path_field.text()
        box_size = self.box_size_slider.value()

        # Define QR code settings
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=box_size,
            border=2,  # Set the border size here. Smaller value = smaller border.
        )
        
        icon_path = os.path.join(bundle_dir, 'resources', 'MunuAppLogo-1500x.png')
        
        for i, line in enumerate(text.split('\n'), start=1):
            if line:  # Skip empty lines
                qr.clear()  # Clear the previous QR code
                qr.add_data(line)
                qr.make(fit=True)

                img = qr.make_image(
                    fill_color="black", 
                    back_color="white",
                    image_factory=StyledPilImage,
                    module_drawer=RoundedModuleDrawer(),
                    eye_drawer=RoundedModuleDrawer(),
                    ).convert('RGB')
                
                            # Load the icon image
                icon = Image.open(icon_path)
                # Resize icon to fit in the QR code
                img_w, img_h = img.size
                factor = 3  # Factor to size down the icon, adjust as needed.
                icon_w = img_w // factor
                icon_h = img_h // factor
                icon = icon.resize((icon_w, icon_h), Image.Resampling.LANCZOS)
                
                # Calculate position to place the icon (center)
                w_pos = (img_w - icon_w) // 2
                h_pos = (img_h - icon_h) // 2
                
                # Paste the icon onto the QR code
                img.paste(icon, (w_pos, h_pos), icon)
                
                file_path = os.path.join(save_path, f'qr_code_{i}.png')
                img.save(file_path)
        
        QMessageBox.information(self, "Success", "QR codes generated successfully!")

    def update_box_size_label(self):
        input_text = self.input_box.toPlainText()  # Get the current text input
        first_line = input_text.split('\n', 1)[0] if input_text else ""  # Get only the first line
        input_length = len(first_line)  # Calculate the length of the input
        estimated_version = self.estimate_qr_version(input_length)  # Estimate the QR version
        
        if estimated_version is None:
            self.box_size_label.setText("Input too long for estimation")
            return

        # Assuming a fixed border size of 4 modules
        border_size_modules = 4
        box_size = self.box_size_slider.value()
        
        # Calculate the number of modules for the estimated version
        qr_code_version_modules = 21 + (estimated_version - 1) * 4
        image_size_pixels = ((qr_code_version_modules * box_size) + (2 * border_size_modules * box_size))
        print(f"Box size = {box_size}")
        print(f"Input length = {input_length}")

        # Update the label to display the estimated total image size in pixels
        self.box_size_label.setText(f'Estimated Image Size: {image_size_pixels}x{image_size_pixels} pixels')

    def estimate_qr_version(self, input_length, error_correction='H'):
        # Simplified capacity for alphanumeric mode with error correction level H
        capacities = [
            (15, 1), (25, 2), (35, 3), (45, 4), (59, 5),
            (65, 6), (85, 7), (99, 8)
        ]
        for capacity, version in capacities:
            if input_length + 1 <= capacity:
                return version
        return None  # Return None if input is too long for estimated capacities
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant