mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-10 16:22:22 +03:00
Merge 99737228c5
into 329d6a6a62
This commit is contained in:
commit
73917812f7
|
@ -101,9 +101,8 @@ def test_fromarray_strides_without_tobytes() -> None:
|
||||||
self.__array_interface__ = arr_params
|
self.__array_interface__ = arr_params
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
wrapped = Wrapper({"shape": (1, 1), "strides": (1, 1)})
|
wrapped = Wrapper({"shape": (1, 1), "strides": (1, 1), "typestr": "|u1"})
|
||||||
with pytest.warns(DeprecationWarning, match="'mode' parameter"):
|
Image.fromarray(wrapped, "L")
|
||||||
Image.fromarray(wrapped, "L")
|
|
||||||
|
|
||||||
|
|
||||||
def test_fromarray_palette() -> None:
|
def test_fromarray_palette() -> None:
|
||||||
|
@ -112,9 +111,16 @@ def test_fromarray_palette() -> None:
|
||||||
a = numpy.array(i)
|
a = numpy.array(i)
|
||||||
|
|
||||||
# Act
|
# Act
|
||||||
with pytest.warns(DeprecationWarning, match="'mode' parameter"):
|
out = Image.fromarray(a, "P")
|
||||||
out = Image.fromarray(a, "P")
|
|
||||||
|
|
||||||
# Assert that the Python and C palettes match
|
# Assert that the Python and C palettes match
|
||||||
assert out.palette is not None
|
assert out.palette is not None
|
||||||
assert len(out.palette.colors) == len(out.im.getpalette()) / 3
|
assert len(out.palette.colors) == len(out.im.getpalette()) / 3
|
||||||
|
|
||||||
|
|
||||||
|
def test_deprecation() -> None:
|
||||||
|
a = numpy.array(im.convert("L"))
|
||||||
|
with pytest.warns(
|
||||||
|
DeprecationWarning, match="'mode' parameter for changing data types"
|
||||||
|
):
|
||||||
|
Image.fromarray(a, "1")
|
||||||
|
|
|
@ -3253,19 +3253,9 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image:
|
||||||
transferred. This means that P and PA mode images will lose their palette.
|
transferred. This means that P and PA mode images will lose their palette.
|
||||||
|
|
||||||
:param obj: Object with array interface
|
:param obj: Object with array interface
|
||||||
:param mode: Optional mode to use when reading ``obj``. Will be determined from
|
:param mode: Optional mode to use when reading ``obj``. Since pixel values do not
|
||||||
type if ``None``. Deprecated.
|
contain information about palettes or color spaces, this can be used to place
|
||||||
|
grayscale L mode data within a P mode image, or read RGB data as YCbCr.
|
||||||
This will not be used to convert the data after reading, but will be used to
|
|
||||||
change how the data is read::
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
import numpy as np
|
|
||||||
a = np.full((1, 1), 300)
|
|
||||||
im = Image.fromarray(a, mode="L")
|
|
||||||
im.getpixel((0, 0)) # 44
|
|
||||||
im = Image.fromarray(a, mode="RGB")
|
|
||||||
im.getpixel((0, 0)) # (44, 1, 0)
|
|
||||||
|
|
||||||
See: :ref:`concept-modes` for general information about modes.
|
See: :ref:`concept-modes` for general information about modes.
|
||||||
:returns: An image object.
|
:returns: An image object.
|
||||||
|
@ -3276,21 +3266,28 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image:
|
||||||
shape = arr["shape"]
|
shape = arr["shape"]
|
||||||
ndim = len(shape)
|
ndim = len(shape)
|
||||||
strides = arr.get("strides", None)
|
strides = arr.get("strides", None)
|
||||||
if mode is None:
|
try:
|
||||||
try:
|
typekey = (1, 1) + shape[2:], arr["typestr"]
|
||||||
typekey = (1, 1) + shape[2:], arr["typestr"]
|
except KeyError as e:
|
||||||
except KeyError as e:
|
if mode is not None:
|
||||||
|
typekey = None
|
||||||
|
color_modes: list[str] = []
|
||||||
|
else:
|
||||||
msg = "Cannot handle this data type"
|
msg = "Cannot handle this data type"
|
||||||
raise TypeError(msg) from e
|
raise TypeError(msg) from e
|
||||||
|
if typekey is not None:
|
||||||
try:
|
try:
|
||||||
mode, rawmode = _fromarray_typemap[typekey]
|
typemode, rawmode, color_modes = _fromarray_typemap[typekey]
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
typekey_shape, typestr = typekey
|
typekey_shape, typestr = typekey
|
||||||
msg = f"Cannot handle this data type: {typekey_shape}, {typestr}"
|
msg = f"Cannot handle this data type: {typekey_shape}, {typestr}"
|
||||||
raise TypeError(msg) from e
|
raise TypeError(msg) from e
|
||||||
else:
|
if mode is not None:
|
||||||
deprecate("'mode' parameter", 13)
|
if mode != typemode and mode not in color_modes:
|
||||||
|
deprecate("'mode' parameter for changing data types", 13)
|
||||||
rawmode = mode
|
rawmode = mode
|
||||||
|
else:
|
||||||
|
mode = typemode
|
||||||
if mode in ["1", "L", "I", "P", "F"]:
|
if mode in ["1", "L", "I", "P", "F"]:
|
||||||
ndmax = 2
|
ndmax = 2
|
||||||
elif mode == "RGB":
|
elif mode == "RGB":
|
||||||
|
@ -3387,29 +3384,29 @@ def fromqpixmap(im: ImageQt.QPixmap) -> ImageFile.ImageFile:
|
||||||
|
|
||||||
|
|
||||||
_fromarray_typemap = {
|
_fromarray_typemap = {
|
||||||
# (shape, typestr) => mode, rawmode
|
# (shape, typestr) => mode, rawmode, color modes
|
||||||
# first two members of shape are set to one
|
# first two members of shape are set to one
|
||||||
((1, 1), "|b1"): ("1", "1;8"),
|
((1, 1), "|b1"): ("1", "1;8", []),
|
||||||
((1, 1), "|u1"): ("L", "L"),
|
((1, 1), "|u1"): ("L", "L", ["P"]),
|
||||||
((1, 1), "|i1"): ("I", "I;8"),
|
((1, 1), "|i1"): ("I", "I;8", []),
|
||||||
((1, 1), "<u2"): ("I", "I;16"),
|
((1, 1), "<u2"): ("I", "I;16", []),
|
||||||
((1, 1), ">u2"): ("I", "I;16B"),
|
((1, 1), ">u2"): ("I", "I;16B", []),
|
||||||
((1, 1), "<i2"): ("I", "I;16S"),
|
((1, 1), "<i2"): ("I", "I;16S", []),
|
||||||
((1, 1), ">i2"): ("I", "I;16BS"),
|
((1, 1), ">i2"): ("I", "I;16BS", []),
|
||||||
((1, 1), "<u4"): ("I", "I;32"),
|
((1, 1), "<u4"): ("I", "I;32", []),
|
||||||
((1, 1), ">u4"): ("I", "I;32B"),
|
((1, 1), ">u4"): ("I", "I;32B", []),
|
||||||
((1, 1), "<i4"): ("I", "I;32S"),
|
((1, 1), "<i4"): ("I", "I;32S", []),
|
||||||
((1, 1), ">i4"): ("I", "I;32BS"),
|
((1, 1), ">i4"): ("I", "I;32BS", []),
|
||||||
((1, 1), "<f4"): ("F", "F;32F"),
|
((1, 1), "<f4"): ("F", "F;32F", []),
|
||||||
((1, 1), ">f4"): ("F", "F;32BF"),
|
((1, 1), ">f4"): ("F", "F;32BF", []),
|
||||||
((1, 1), "<f8"): ("F", "F;64F"),
|
((1, 1), "<f8"): ("F", "F;64F", []),
|
||||||
((1, 1), ">f8"): ("F", "F;64BF"),
|
((1, 1), ">f8"): ("F", "F;64BF", []),
|
||||||
((1, 1, 2), "|u1"): ("LA", "LA"),
|
((1, 1, 2), "|u1"): ("LA", "LA", ["La", "PA"]),
|
||||||
((1, 1, 3), "|u1"): ("RGB", "RGB"),
|
((1, 1, 3), "|u1"): ("RGB", "RGB", ["YCbCr", "LAB", "HSV"]),
|
||||||
((1, 1, 4), "|u1"): ("RGBA", "RGBA"),
|
((1, 1, 4), "|u1"): ("RGBA", "RGBA", ["RGBa"]),
|
||||||
# shortcuts:
|
# shortcuts:
|
||||||
((1, 1), f"{_ENDIAN}i4"): ("I", "I"),
|
((1, 1), f"{_ENDIAN}i4"): ("I", "I", []),
|
||||||
((1, 1), f"{_ENDIAN}f4"): ("F", "F"),
|
((1, 1), f"{_ENDIAN}f4"): ("F", "F", []),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user