Treat data as big-endian

This commit is contained in:
Andrew Murray 2026-04-20 09:12:38 +10:00
parent 43b648064c
commit b38327985b
2 changed files with 31 additions and 5 deletions

View File

@ -24,6 +24,8 @@ def test_open() -> None:
def test_gzip1() -> None:
with Image.open("Tests/images/m13_gzip.fits") as im:
assert im.getpixel((0, 0)) == 111
assert_image_equal_tofile(im, "Tests/images/m13.fits")
@ -36,6 +38,22 @@ def test_invalid_file() -> None:
FitsImagePlugin.FitsImageFile(invalid_file)
def test_unsupported_number_of_bits() -> None:
image_data = b"".join(
data.ljust(80, b" ")
for data in [
b"SIMPLE = T",
b"BITPIX = 128",
b"NAXIS = 1",
b"NAXIS1 = 0",
b"END",
]
)
with pytest.raises(OSError, match="Unsupported number of bits"):
with Image.open(BytesIO(image_data)):
pass
def test_truncated_fits() -> None:
# No END to headers
image_data = b"SIMPLE = T" + b" " * 50 + b"TRUNCATE"

View File

@ -107,17 +107,23 @@ class FitsImageFile(ImageFile.ImageFile):
number_of_bits = int(headers[prefix + b"BITPIX"])
if number_of_bits == 8:
self._mode = "L"
self._mode = rawmode = "L"
elif number_of_bits == 16:
self._mode = "I;16"
rawmode = "I;16B"
elif number_of_bits == 32:
self._mode = "I"
elif number_of_bits in (-32, -64):
rawmode = "I;32B"
elif number_of_bits == -32 or (decoder_name == "raw" and number_of_bits == -64):
self._mode = "F"
rawmode = f"F;{number_of_bits * -1}BF"
else:
msg = "Unsupported number of bits"
raise OSError(msg)
args: tuple[str | int, ...]
if decoder_name == "raw":
args = (self.mode, 0, -1)
args = (rawmode, 0, -1)
else:
args = (number_of_bits,)
return decoder_name, offset, args
@ -133,11 +139,13 @@ class FitsGzipDecoder(ImageFile.PyDecoder):
rows = []
offset = 0
number_of_bits = min(self.args[0] // 8, 4)
number_of_bytes = abs(self.args[0]) // 8
for y in range(self.state.ysize):
row = bytearray()
for x in range(self.state.xsize):
row += value[offset + (4 - number_of_bits) : offset + 4]
row += value[
offset + 4 - 1 : offset + (4 - number_of_bytes) - 1 : -1
]
offset += 4
rows.append(row)
self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row]))