mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-06-29 09:23:11 +03:00
Merge 06b50389b0
into 7e4d8e2f55
This commit is contained in:
commit
d58235fa73
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from io import BytesIO
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -71,6 +72,15 @@ def test_invalid_file() -> None:
|
||||||
SgiImagePlugin.SgiImageFile(invalid_file)
|
SgiImagePlugin.SgiImageFile(invalid_file)
|
||||||
|
|
||||||
|
|
||||||
|
def test_unsupported_image_mode() -> None:
|
||||||
|
with open("Tests/images/hopper.rgb", "rb") as fp:
|
||||||
|
data = fp.read()
|
||||||
|
data = data[:3] + b"\x03" + data[4:]
|
||||||
|
with pytest.raises(ValueError, match="Unsupported SGI image mode"):
|
||||||
|
with Image.open(BytesIO(data)):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def roundtrip(img: Image.Image, tmp_path: Path) -> None:
|
def roundtrip(img: Image.Image, tmp_path: Path) -> None:
|
||||||
out = tmp_path / "temp.sgi"
|
out = tmp_path / "temp.sgi"
|
||||||
img.save(out, format="sgi")
|
img.save(out, format="sgi")
|
||||||
|
@ -109,3 +119,11 @@ def test_unsupported_mode(tmp_path: Path) -> None:
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
im.save(out, format="sgi")
|
im.save(out, format="sgi")
|
||||||
|
|
||||||
|
|
||||||
|
def test_unsupported_number_of_bytes_per_pixel(tmp_path: Path) -> None:
|
||||||
|
im = hopper()
|
||||||
|
out = tmp_path / "temp.sgi"
|
||||||
|
|
||||||
|
with pytest.raises(ValueError, match="Unsupported number of bytes per pixel"):
|
||||||
|
im.save(out, bpc=3)
|
||||||
|
|
|
@ -82,17 +82,10 @@ class SgiImageFile(ImageFile.ImageFile):
|
||||||
# zsize : channels count
|
# zsize : channels count
|
||||||
zsize = i16(s, 10)
|
zsize = i16(s, 10)
|
||||||
|
|
||||||
# layout
|
|
||||||
layout = bpc, dimension, zsize
|
|
||||||
|
|
||||||
# determine mode from bits/zsize
|
# determine mode from bits/zsize
|
||||||
rawmode = ""
|
|
||||||
try:
|
try:
|
||||||
rawmode = MODES[layout]
|
rawmode = MODES[(bpc, dimension, zsize)]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
|
||||||
|
|
||||||
if rawmode == "":
|
|
||||||
msg = "Unsupported SGI image mode"
|
msg = "Unsupported SGI image mode"
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
|
@ -156,24 +149,15 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
|
||||||
# Run-Length Encoding Compression - Unsupported at this time
|
# Run-Length Encoding Compression - Unsupported at this time
|
||||||
rle = 0
|
rle = 0
|
||||||
|
|
||||||
# Number of dimensions (x,y,z)
|
|
||||||
dim = 3
|
|
||||||
# X Dimension = width / Y Dimension = height
|
# X Dimension = width / Y Dimension = height
|
||||||
x, y = im.size
|
x, y = im.size
|
||||||
if im.mode == "L" and y == 1:
|
|
||||||
dim = 1
|
|
||||||
elif im.mode == "L":
|
|
||||||
dim = 2
|
|
||||||
# Z Dimension: Number of channels
|
# Z Dimension: Number of channels
|
||||||
z = len(im.mode)
|
z = len(im.mode)
|
||||||
|
# Number of dimensions (x,y,z)
|
||||||
if dim in {1, 2}:
|
if im.mode == "L":
|
||||||
z = 1
|
dim = 1 if y == 1 else 2
|
||||||
|
else:
|
||||||
# assert we've got the right number of bands.
|
dim = 3
|
||||||
if len(im.getbands()) != z:
|
|
||||||
msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}"
|
|
||||||
raise ValueError(msg)
|
|
||||||
|
|
||||||
# Minimum Byte value
|
# Minimum Byte value
|
||||||
pinmin = 0
|
pinmin = 0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user