|
41 | 41 | from collections.abc import Callable, MutableMapping |
42 | 42 | from enum import IntEnum |
43 | 43 | from types import ModuleType |
44 | | -from typing import IO, TYPE_CHECKING, Any |
| 44 | +from typing import IO, TYPE_CHECKING, Any, Protocol |
45 | 45 |
|
46 | 46 | # VERSION was removed in Pillow 6.0.0. |
47 | 47 | # PILLOW_VERSION was removed in Pillow 9.0.0. |
@@ -3013,7 +3013,7 @@ def frombytes(mode, size, data, decoder_name="raw", *args) -> Image: |
3013 | 3013 | return im |
3014 | 3014 |
|
3015 | 3015 |
|
3016 | | -def frombuffer(mode, size, data, decoder_name="raw", *args): |
| 3016 | +def frombuffer(mode, size, data, decoder_name="raw", *args) -> Image: |
3017 | 3017 | """ |
3018 | 3018 | Creates an image memory referencing pixel data in a byte buffer. |
3019 | 3019 |
|
@@ -3069,10 +3069,15 @@ def frombuffer(mode, size, data, decoder_name="raw", *args): |
3069 | 3069 | return frombytes(mode, size, data, decoder_name, args) |
3070 | 3070 |
|
3071 | 3071 |
|
3072 | | -def fromarray( |
3073 | | - obj, # type: numpy.typing.ArrayLike |
3074 | | - mode: str | None = None, |
3075 | | -) -> Image: |
| 3072 | +class SupportsArrayInterface(Protocol): |
| 3073 | + """ |
| 3074 | + An object that has an ``__array_interface__`` dictionary. |
| 3075 | + """ |
| 3076 | + |
| 3077 | + __array_interface__: dict[str, Any] |
| 3078 | + |
| 3079 | + |
| 3080 | +def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: |
3076 | 3081 | """ |
3077 | 3082 | Creates an image memory from an object exporting the array interface |
3078 | 3083 | (using the buffer protocol):: |
@@ -3151,8 +3156,11 @@ def fromarray( |
3151 | 3156 | if strides is not None: |
3152 | 3157 | if hasattr(obj, "tobytes"): |
3153 | 3158 | obj = obj.tobytes() |
3154 | | - else: |
| 3159 | + elif hasattr(obj, "tostring"): |
3155 | 3160 | obj = obj.tostring() |
| 3161 | + else: |
| 3162 | + msg = "'strides' requires either tobytes() or tostring()" |
| 3163 | + raise ValueError(msg) |
3156 | 3164 |
|
3157 | 3165 | return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) |
3158 | 3166 |
|
|
0 commit comments