mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 07:57:27 +03:00 
			
		
		
		
	Only deprecate fromarray mode for changing data types
This commit is contained in:
		
							parent
							
								
									44a553a0a2
								
							
						
					
					
						commit
						99737228c5
					
				|  | @ -101,9 +101,8 @@ def test_fromarray_strides_without_tobytes() -> None: | |||
|             self.__array_interface__ = arr_params | ||||
| 
 | ||||
|     with pytest.raises(ValueError): | ||||
|         wrapped = Wrapper({"shape": (1, 1), "strides": (1, 1)}) | ||||
|         with pytest.warns(DeprecationWarning, match="'mode' parameter"): | ||||
|             Image.fromarray(wrapped, "L") | ||||
|         wrapped = Wrapper({"shape": (1, 1), "strides": (1, 1), "typestr": "|u1"}) | ||||
|         Image.fromarray(wrapped, "L") | ||||
| 
 | ||||
| 
 | ||||
| def test_fromarray_palette() -> None: | ||||
|  | @ -112,9 +111,16 @@ def test_fromarray_palette() -> None: | |||
|     a = numpy.array(i) | ||||
| 
 | ||||
|     # 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 out.palette is not None | ||||
|     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") | ||||
|  |  | |||
|  | @ -3251,19 +3251,9 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: | |||
|     transferred. This means that P and PA mode images will lose their palette. | ||||
| 
 | ||||
|     :param obj: Object with array interface | ||||
|     :param mode: Optional mode to use when reading ``obj``. Will be determined from | ||||
|       type if ``None``. Deprecated. | ||||
| 
 | ||||
|       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) | ||||
|     :param mode: Optional mode to use when reading ``obj``. Since pixel values do not | ||||
|       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. | ||||
| 
 | ||||
|       See: :ref:`concept-modes` for general information about modes. | ||||
|     :returns: An image object. | ||||
|  | @ -3274,21 +3264,28 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: | |||
|     shape = arr["shape"] | ||||
|     ndim = len(shape) | ||||
|     strides = arr.get("strides", None) | ||||
|     if mode is None: | ||||
|         try: | ||||
|             typekey = (1, 1) + shape[2:], arr["typestr"] | ||||
|         except KeyError as e: | ||||
|     try: | ||||
|         typekey = (1, 1) + shape[2:], arr["typestr"] | ||||
|     except KeyError as e: | ||||
|         if mode is not None: | ||||
|             typekey = None | ||||
|             color_modes: list[str] = [] | ||||
|         else: | ||||
|             msg = "Cannot handle this data type" | ||||
|             raise TypeError(msg) from e | ||||
|     if typekey is not None: | ||||
|         try: | ||||
|             mode, rawmode = _fromarray_typemap[typekey] | ||||
|             typemode, rawmode, color_modes = _fromarray_typemap[typekey] | ||||
|         except KeyError as e: | ||||
|             typekey_shape, typestr = typekey | ||||
|             msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" | ||||
|             raise TypeError(msg) from e | ||||
|     else: | ||||
|         deprecate("'mode' parameter", 13) | ||||
|     if mode is not None: | ||||
|         if mode != typemode and mode not in color_modes: | ||||
|             deprecate("'mode' parameter for changing data types", 13) | ||||
|         rawmode = mode | ||||
|     else: | ||||
|         mode = typemode | ||||
|     if mode in ["1", "L", "I", "P", "F"]: | ||||
|         ndmax = 2 | ||||
|     elif mode == "RGB": | ||||
|  | @ -3385,29 +3382,29 @@ def fromqpixmap(im: ImageQt.QPixmap) -> ImageFile.ImageFile: | |||
| 
 | ||||
| 
 | ||||
| _fromarray_typemap = { | ||||
|     # (shape, typestr) => mode, rawmode | ||||
|     # (shape, typestr) => mode, rawmode, color modes | ||||
|     # first two members of shape are set to one | ||||
|     ((1, 1), "|b1"): ("1", "1;8"), | ||||
|     ((1, 1), "|u1"): ("L", "L"), | ||||
|     ((1, 1), "|i1"): ("I", "I;8"), | ||||
|     ((1, 1), "<u2"): ("I", "I;16"), | ||||
|     ((1, 1), ">u2"): ("I", "I;16B"), | ||||
|     ((1, 1), "<i2"): ("I", "I;16S"), | ||||
|     ((1, 1), ">i2"): ("I", "I;16BS"), | ||||
|     ((1, 1), "<u4"): ("I", "I;32"), | ||||
|     ((1, 1), ">u4"): ("I", "I;32B"), | ||||
|     ((1, 1), "<i4"): ("I", "I;32S"), | ||||
|     ((1, 1), ">i4"): ("I", "I;32BS"), | ||||
|     ((1, 1), "<f4"): ("F", "F;32F"), | ||||
|     ((1, 1), ">f4"): ("F", "F;32BF"), | ||||
|     ((1, 1), "<f8"): ("F", "F;64F"), | ||||
|     ((1, 1), ">f8"): ("F", "F;64BF"), | ||||
|     ((1, 1, 2), "|u1"): ("LA", "LA"), | ||||
|     ((1, 1, 3), "|u1"): ("RGB", "RGB"), | ||||
|     ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), | ||||
|     ((1, 1), "|b1"): ("1", "1;8", []), | ||||
|     ((1, 1), "|u1"): ("L", "L", ["P"]), | ||||
|     ((1, 1), "|i1"): ("I", "I;8", []), | ||||
|     ((1, 1), "<u2"): ("I", "I;16", []), | ||||
|     ((1, 1), ">u2"): ("I", "I;16B", []), | ||||
|     ((1, 1), "<i2"): ("I", "I;16S", []), | ||||
|     ((1, 1), ">i2"): ("I", "I;16BS", []), | ||||
|     ((1, 1), "<u4"): ("I", "I;32", []), | ||||
|     ((1, 1), ">u4"): ("I", "I;32B", []), | ||||
|     ((1, 1), "<i4"): ("I", "I;32S", []), | ||||
|     ((1, 1), ">i4"): ("I", "I;32BS", []), | ||||
|     ((1, 1), "<f4"): ("F", "F;32F", []), | ||||
|     ((1, 1), ">f4"): ("F", "F;32BF", []), | ||||
|     ((1, 1), "<f8"): ("F", "F;64F", []), | ||||
|     ((1, 1), ">f8"): ("F", "F;64BF", []), | ||||
|     ((1, 1, 2), "|u1"): ("LA", "LA", ["La", "PA"]), | ||||
|     ((1, 1, 3), "|u1"): ("RGB", "RGB", ["YCbCr", "LAB", "HSV"]), | ||||
|     ((1, 1, 4), "|u1"): ("RGBA", "RGBA", ["RGBa"]), | ||||
|     # shortcuts: | ||||
|     ((1, 1), f"{_ENDIAN}i4"): ("I", "I"), | ||||
|     ((1, 1), f"{_ENDIAN}f4"): ("F", "F"), | ||||
|     ((1, 1), f"{_ENDIAN}i4"): ("I", "I", []), | ||||
|     ((1, 1), f"{_ENDIAN}f4"): ("F", "F", []), | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user