Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/PIL/FitsImagePlugin.py: 18%
40 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
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#
12import math
14from . import Image, ImageFile
17def _accept(prefix):
18 return prefix[:6] == b"SIMPLE"
21class FitsImageFile(ImageFile.ImageFile):
23 format = "FITS"
24 format_description = "FITS"
26 def _open(self):
27 headers = {}
28 while True:
29 header = self.fp.read(80)
30 if not header:
31 raise OSError("Truncated FITS file")
32 keyword = header[:8].strip()
33 if keyword == b"END":
34 break
35 value = header[8:].strip()
36 if value.startswith(b"="):
37 value = value[1:].strip()
38 if not headers and (not _accept(keyword) or value != b"T"):
39 raise SyntaxError("Not a FITS file")
40 headers[keyword] = value
42 naxis = int(headers[b"NAXIS"])
43 if naxis == 0:
44 raise ValueError("No image data")
45 elif naxis == 1:
46 self._size = 1, int(headers[b"NAXIS1"])
47 else:
48 self._size = int(headers[b"NAXIS1"]), int(headers[b"NAXIS2"])
50 number_of_bits = int(headers[b"BITPIX"])
51 if number_of_bits == 8:
52 self.mode = "L"
53 elif number_of_bits == 16:
54 self.mode = "I"
55 # rawmode = "I;16S"
56 elif number_of_bits == 32:
57 self.mode = "I"
58 elif number_of_bits in (-32, -64):
59 self.mode = "F"
60 # rawmode = "F" if number_of_bits == -32 else "F;64F"
62 offset = math.ceil(self.fp.tell() / 2880) * 2880
63 self.tile = [("raw", (0, 0) + self.size, offset, (self.mode, 0, -1))]
66# --------------------------------------------------------------------
67# Registry
69Image.register_open(FitsImageFile.format, FitsImageFile, _accept)
71Image.register_extensions(FitsImageFile.format, [".fit", ".fits"])