McIdasImagePlugin.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # Basic McIdas support for PIL
  6. #
  7. # History:
  8. # 1997-05-05 fl Created (8-bit images only)
  9. # 2009-03-08 fl Added 16/32-bit support.
  10. #
  11. # Thanks to Richard Jones and Craig Swank for specs and samples.
  12. #
  13. # Copyright (c) Secret Labs AB 1997.
  14. # Copyright (c) Fredrik Lundh 1997.
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18. from __future__ import annotations
  19. import struct
  20. from . import Image, ImageFile
  21. def _accept(prefix: bytes) -> bool:
  22. return prefix[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04"
  23. ##
  24. # Image plugin for McIdas area images.
  25. class McIdasImageFile(ImageFile.ImageFile):
  26. format = "MCIDAS"
  27. format_description = "McIdas area file"
  28. def _open(self) -> None:
  29. # parse area file directory
  30. assert self.fp is not None
  31. s = self.fp.read(256)
  32. if not _accept(s) or len(s) != 256:
  33. msg = "not an McIdas area file"
  34. raise SyntaxError(msg)
  35. self.area_descriptor_raw = s
  36. self.area_descriptor = w = [0] + list(struct.unpack("!64i", s))
  37. # get mode
  38. if w[11] == 1:
  39. mode = rawmode = "L"
  40. elif w[11] == 2:
  41. # FIXME: add memory map support
  42. mode = "I"
  43. rawmode = "I;16B"
  44. elif w[11] == 4:
  45. # FIXME: add memory map support
  46. mode = "I"
  47. rawmode = "I;32B"
  48. else:
  49. msg = "unsupported McIdas format"
  50. raise SyntaxError(msg)
  51. self._mode = mode
  52. self._size = w[10], w[9]
  53. offset = w[34] + w[15]
  54. stride = w[15] + w[10] * w[11] * w[14]
  55. self.tile = [
  56. ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))
  57. ]
  58. # --------------------------------------------------------------------
  59. # registry
  60. Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept)
  61. # no default extension