FitsImagePlugin.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #
  2. # The Python Imaging Library
  3. # $Id$
  4. #
  5. # FITS file handling
  6. #
  7. # Copyright (c) 1998-2003 by Fredrik Lundh
  8. #
  9. # See the README file for information on usage and redistribution.
  10. #
  11. from __future__ import annotations
  12. import math
  13. from . import Image, ImageFile
  14. def _accept(prefix):
  15. return prefix[:6] == b"SIMPLE"
  16. class FitsImageFile(ImageFile.ImageFile):
  17. format = "FITS"
  18. format_description = "FITS"
  19. def _open(self):
  20. headers = {}
  21. while True:
  22. header = self.fp.read(80)
  23. if not header:
  24. msg = "Truncated FITS file"
  25. raise OSError(msg)
  26. keyword = header[:8].strip()
  27. if keyword == b"END":
  28. break
  29. value = header[8:].split(b"/")[0].strip()
  30. if value.startswith(b"="):
  31. value = value[1:].strip()
  32. if not headers and (not _accept(keyword) or value != b"T"):
  33. msg = "Not a FITS file"
  34. raise SyntaxError(msg)
  35. headers[keyword] = value
  36. naxis = int(headers[b"NAXIS"])
  37. if naxis == 0:
  38. msg = "No image data"
  39. raise ValueError(msg)
  40. elif naxis == 1:
  41. self._size = 1, int(headers[b"NAXIS1"])
  42. else:
  43. self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"])
  44. number_of_bits = int(headers[b"BITPIX"])
  45. if number_of_bits == 8:
  46. self._mode = "L"
  47. elif number_of_bits == 16:
  48. self._mode = "I"
  49. elif number_of_bits == 32:
  50. self._mode = "I"
  51. elif number_of_bits in (-32, -64):
  52. self._mode = "F"
  53. offset = math.ceil(self.fp.tell() / 2880) * 2880
  54. self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))]
  55. # --------------------------------------------------------------------
  56. # Registry
  57. Image.register_open(FitsImageFile.format, FitsImageFile, _accept)
  58. Image.register_extensions(FitsImageFile.format, [".fit", ".fits"])