pil.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # Needed on case-insensitive filesystems
  2. from __future__ import absolute_import
  3. # Try to import PIL in either of the two ways it can be installed.
  4. try:
  5. from PIL import Image, ImageDraw
  6. except ImportError: # pragma: no cover
  7. import Image
  8. import ImageDraw
  9. import qrcode.image.base
  10. class PilImage(qrcode.image.base.BaseImage):
  11. """
  12. PIL image builder, default format is PNG.
  13. """
  14. kind = "PNG"
  15. def new_image(self, **kwargs):
  16. back_color = kwargs.get("back_color", "white")
  17. fill_color = kwargs.get("fill_color", "black")
  18. if fill_color.lower() != "black" or back_color.lower() != "white":
  19. if back_color.lower() == "transparent":
  20. mode = "RGBA"
  21. back_color = None
  22. else:
  23. mode = "RGB"
  24. else:
  25. mode = "1"
  26. # L mode (1 mode) color = (r*299 + g*587 + b*114)//1000
  27. if fill_color.lower() == "black": fill_color = 0
  28. if back_color.lower() == "white": back_color = 255
  29. img = Image.new(mode, (self.pixel_size, self.pixel_size), back_color)
  30. self.fill_color = fill_color
  31. self._idr = ImageDraw.Draw(img)
  32. return img
  33. def drawrect(self, row, col):
  34. box = self.pixel_box(row, col)
  35. self._idr.rectangle(box, fill=self.fill_color)
  36. def save(self, stream, format=None, **kwargs):
  37. if format is None:
  38. format = kwargs.get("kind", self.kind)
  39. if "kind" in kwargs:
  40. del kwargs["kind"]
  41. self._img.save(stream, format=format, **kwargs)
  42. def __getattr__(self, name):
  43. return getattr(self._img, name)