pil.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import qrcode.image.base
  2. from PIL import Image, ImageDraw
  3. class PilImage(qrcode.image.base.BaseImage):
  4. """
  5. PIL image builder, default format is PNG.
  6. """
  7. kind = "PNG"
  8. def new_image(self, **kwargs):
  9. if not Image:
  10. raise ImportError("PIL library not found.")
  11. back_color = kwargs.get("back_color", "white")
  12. fill_color = kwargs.get("fill_color", "black")
  13. try:
  14. fill_color = fill_color.lower()
  15. except AttributeError:
  16. pass
  17. try:
  18. back_color = back_color.lower()
  19. except AttributeError:
  20. pass
  21. # L mode (1 mode) color = (r*299 + g*587 + b*114)//1000
  22. if fill_color == "black" and back_color == "white":
  23. mode = "1"
  24. fill_color = 0
  25. if back_color == "white":
  26. back_color = 255
  27. elif back_color == "transparent":
  28. mode = "RGBA"
  29. back_color = None
  30. else:
  31. mode = "RGB"
  32. img = Image.new(mode, (self.pixel_size, self.pixel_size), back_color)
  33. self.fill_color = fill_color
  34. self._idr = ImageDraw.Draw(img)
  35. return img
  36. def drawrect(self, row, col):
  37. box = self.pixel_box(row, col)
  38. self._idr.rectangle(box, fill=self.fill_color)
  39. def save(self, stream, format=None, **kwargs):
  40. kind = kwargs.pop("kind", self.kind)
  41. if format is None:
  42. format = kind
  43. self._img.save(stream, format=format, **kwargs)
  44. def __getattr__(self, name):
  45. return getattr(self._img, name)