Treat data as big-endian
This commit is contained in:
parent
43b648064c
commit
b38327985b
@ -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"
|
||||
|
||||
@ -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]))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user