| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #
- # The Python Imaging Library
- # $Id$
- #
- # FITS file handling
- #
- # Copyright (c) 1998-2003 by Fredrik Lundh
- #
- # See the README file for information on usage and redistribution.
- #
- import math
- from . import Image, ImageFile
- def _accept(prefix):
- return prefix[:6] == b"SIMPLE"
- class FitsImageFile(ImageFile.ImageFile):
- format = "FITS"
- format_description = "FITS"
- def _open(self):
- headers = {}
- while True:
- header = self.fp.read(80)
- if not header:
- raise OSError("Truncated FITS file")
- keyword = header[:8].strip()
- if keyword == b"END":
- break
- value = header[8:].strip()
- if value.startswith(b"="):
- value = value[1:].strip()
- if not headers and (not _accept(keyword) or value != b"T"):
- raise SyntaxError("Not a FITS file")
- headers[keyword] = value
- naxis = int(headers[b"NAXIS"])
- if naxis == 0:
- raise ValueError("No image data")
- elif naxis == 1:
- self._size = 1, int(headers[b"NAXIS1"])
- else:
- self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"])
- number_of_bits = int(headers[b"BITPIX"])
- if number_of_bits == 8:
- self.mode = "L"
- elif number_of_bits == 16:
- self.mode = "I"
- # rawmode = "I;16S"
- elif number_of_bits == 32:
- self.mode = "I"
- elif number_of_bits in (-32, -64):
- self.mode = "F"
- # rawmode = "F" if number_of_bits == -32 else "F;64F"
- offset = math.ceil(self.fp.tell() / 2880) * 2880
- self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))]
- # --------------------------------------------------------------------
- # Registry
- Image.register_open(FitsImageFile.format, FitsImageFile, _accept)
- Image.register_extensions(FitsImageFile.format, [".fit", ".fits"])
|