# # 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: msg = "Truncated FITS file" raise OSError(msg) keyword = header[:8].strip() if keyword == b"END": break value = header[8:].split(b"/")[0].strip() if value.startswith(b"="): value = value[1:].strip() if not headers and (not _accept(keyword) or value != b"T"): msg = "Not a FITS file" raise SyntaxError(msg) headers[keyword] = value naxis = int(headers[b"NAXIS"]) if naxis == 0: msg = "No image data" raise ValueError(msg) 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"])