| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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" |
| | |
| | elif number_of_bits == 32: |
| | self.mode = "I" |
| | elif number_of_bits in (-32, -64): |
| | self.mode = "F" |
| | |
| |
|
| | offset = math.ceil(self.fp.tell() / 2880) * 2880 |
| | self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))] |
| |
|
| |
|
| | |
| | |
| |
|
| | Image.register_open(FitsImageFile.format, FitsImageFile, _accept) |
| |
|
| | Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) |
| |
|