ImtImagePlugin.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # IM Tools support for PIL
  6. #
  7. # history:
  8. # 1996-05-27 fl Created (read 8-bit images only)
  9. # 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2)
  10. #
  11. # Copyright (c) Secret Labs AB 1997-2001.
  12. # Copyright (c) Fredrik Lundh 1996-2001.
  13. #
  14. # See the README file for information on usage and redistribution.
  15. #
  16. from __future__ import annotations
  17. import re
  18. from . import Image, ImageFile
  19. #
  20. # --------------------------------------------------------------------
  21. field = re.compile(rb"([a-z]*) ([^ \r\n]*)")
  22. ##
  23. # Image plugin for IM Tools images.
  24. class ImtImageFile(ImageFile.ImageFile):
  25. format = "IMT"
  26. format_description = "IM Tools"
  27. def _open(self) -> None:
  28. # Quick rejection: if there's not a LF among the first
  29. # 100 bytes, this is (probably) not a text header.
  30. assert self.fp is not None
  31. buffer = self.fp.read(100)
  32. if b"\n" not in buffer:
  33. msg = "not an IM file"
  34. raise SyntaxError(msg)
  35. xsize = ysize = 0
  36. while True:
  37. if buffer:
  38. s = buffer[:1]
  39. buffer = buffer[1:]
  40. else:
  41. s = self.fp.read(1)
  42. if not s:
  43. break
  44. if s == b"\x0C":
  45. # image data begins
  46. self.tile = [
  47. ImageFile._Tile(
  48. "raw",
  49. (0, 0) + self.size,
  50. self.fp.tell() - len(buffer),
  51. self.mode,
  52. )
  53. ]
  54. break
  55. else:
  56. # read key/value pair
  57. if b"\n" not in buffer:
  58. buffer += self.fp.read(100)
  59. lines = buffer.split(b"\n")
  60. s += lines.pop(0)
  61. buffer = b"\n".join(lines)
  62. if len(s) == 1 or len(s) > 100:
  63. break
  64. if s[0] == ord(b"*"):
  65. continue # comment
  66. m = field.match(s)
  67. if not m:
  68. break
  69. k, v = m.group(1, 2)
  70. if k == b"width":
  71. xsize = int(v)
  72. self._size = xsize, ysize
  73. elif k == b"height":
  74. ysize = int(v)
  75. self._size = xsize, ysize
  76. elif k == b"pixel" and v == b"n8":
  77. self._mode = "L"
  78. #
  79. # --------------------------------------------------------------------
  80. Image.register_open(ImtImageFile.format, ImtImageFile)
  81. #
  82. # no extension registered (".im" is simply too common)