FitsImagePlugin.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. import math
  12. from . import Image, ImageFile
  13. def _accept(prefix):
  14. return prefix[:6] == b"SIMPLE"
  15. class FitsImageFile(ImageFile.ImageFile):
  16. format = "FITS"
  17. format_description = "FITS"
  18. def _open(self):
  19. headers = {}
  20. while True:
  21. header = self.fp.read(80)
  22. if not header:
  23. raise OSError("Truncated FITS file")
  24. keyword = header[:8].strip()
  25. if keyword == b"END":
  26. break
  27. value = header[8:].strip()
  28. if value.startswith(b"="):
  29. value = value[1:].strip()
  30. if not headers and (not _accept(keyword) or value != b"T"):
  31. raise SyntaxError("Not a FITS file")
  32. headers[keyword] = value
  33. naxis = int(headers[b"NAXIS"])
  34. if naxis == 0:
  35. raise ValueError("No image data")
  36. elif naxis == 1:
  37. self._size = 1, int(headers[b"NAXIS1"])
  38. else:
  39. self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"])
  40. number_of_bits = int(headers[b"BITPIX"])
  41. if number_of_bits == 8:
  42. self.mode = "L"
  43. elif number_of_bits == 16:
  44. self.mode = "I"
  45. # rawmode = "I;16S"
  46. elif number_of_bits == 32:
  47. self.mode = "I"
  48. elif number_of_bits in (-32, -64):
  49. self.mode = "F"
  50. # rawmode = "F" if number_of_bits == -32 else "F;64F"
  51. offset = math.ceil(self.fp.tell() / 2880) * 2880
  52. self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))]
  53. # --------------------------------------------------------------------
  54. # Registry
  55. Image.register_open(FitsImageFile.format, FitsImageFile, _accept)
  56. Image.register_extensions(FitsImageFile.format, [".fit", ".fits"])