pure.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from itertools import chain
  2. from qrcode.compat.png import PngWriter
  3. from qrcode.image.base import BaseImage
  4. class PyPNGImage(BaseImage):
  5. """
  6. pyPNG image builder.
  7. """
  8. kind = "PNG"
  9. allowed_kinds = ("PNG",)
  10. needs_drawrect = False
  11. def new_image(self, **kwargs):
  12. if not PngWriter:
  13. raise ImportError("PyPNG library not installed.")
  14. return PngWriter(self.pixel_size, self.pixel_size, greyscale=True, bitdepth=1)
  15. def drawrect(self, row, col):
  16. """
  17. Not used.
  18. """
  19. def save(self, stream, kind=None):
  20. if isinstance(stream, str):
  21. stream = open(stream, "wb")
  22. self._img.write(stream, self.rows_iter())
  23. def rows_iter(self):
  24. yield from self.border_rows_iter()
  25. border_col = [1] * (self.box_size * self.border)
  26. for module_row in self.modules:
  27. row = (
  28. border_col
  29. + list(
  30. chain.from_iterable(
  31. ([not point] * self.box_size) for point in module_row
  32. )
  33. )
  34. + border_col
  35. )
  36. for _ in range(self.box_size):
  37. yield row
  38. yield from self.border_rows_iter()
  39. def border_rows_iter(self):
  40. border_row = [1] * (self.box_size * (self.width + self.border * 2))
  41. for _ in range(self.border * self.box_size):
  42. yield border_row
  43. # Keeping this for backwards compatibility.
  44. PymagingImage = PyPNGImage