Cannot determine region size; use 4-item box

I'm trying to make a QR code and I'm using pillow=11.1.0. Here's the code to generate and save the QR code:

 def save(self, *args, **kwargs):
        ## TODO:Generate QR Code
        # qr_code_url = f"{os.environ['HOST_URL']}/inventory/{self.part_type_id}"
        qrcode_img = qrcode.make(self.part_number)
        canvas = Image.new('RGB', (290, 290), 'white')
        draw = ImageDraw.Draw(canvas)
        canvas.paste(im=qrcode_img, box=(0,0))
        buffer = BytesIO()
        canvas.save(buffer, 'PNG')
        self.qr_code_data.save(f'{self.part_name}.png', File(buffer), save=False)
        canvas.close()
        super().save(*args, **kwargs) 

However when I do save it I'm faced with the following error:

cannot determine region size; use 4-item box

The line in question is:

canvas.paste(im=qrcode_img, box=(0,0))

(At least) two mistakes:

  • the box must be a four-tuple; and
  • the color should be an int or 3-tuple:
def save(self, *args, **kwargs):
    ## TODO:Generate QR Code
    # qr_code_url = f"{os.environ['HOST_URL']}/inventory/{self.part_type_id}"
    qrcode_img = qrcode.make(self.part_number)
    canvas = Image.new('RGB', (290, 290), (255, 255, 255))
    draw = ImageDraw.Draw(canvas)
    canvas.paste(im=qrcode_img, box=(0, 0, 290, 290))
    buffer = BytesIO()
    canvas.save(buffer, 'PNG')
    self.qr_code_data.save(f'{self.part_name}.png', File(buffer), save=False)
    canvas.close()
    super().save(*args, **kwargs)

That being said, proactively render bitmaps is probably not efficient. You can generate a (vectorized) QR code on demand. See for example this answer.

Back to Top