pixelkid 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pixelkid-0.1.0/LICENSE +9 -0
- pixelkid-0.1.0/PKG-INFO +93 -0
- pixelkid-0.1.0/README.md +73 -0
- pixelkid-0.1.0/pyproject.toml +25 -0
- pixelkid-0.1.0/setup.cfg +4 -0
- pixelkid-0.1.0/src/pixelkid/__init__.py +46 -0
- pixelkid-0.1.0/src/pixelkid.egg-info/PKG-INFO +93 -0
- pixelkid-0.1.0/src/pixelkid.egg-info/SOURCES.txt +10 -0
- pixelkid-0.1.0/src/pixelkid.egg-info/dependency_links.txt +1 -0
- pixelkid-0.1.0/src/pixelkid.egg-info/requires.txt +6 -0
- pixelkid-0.1.0/src/pixelkid.egg-info/top_level.txt +1 -0
- pixelkid-0.1.0/tests/test_pixelate.py +33 -0
pixelkid-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MASTERSAM
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
pixelkid-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pixelkid
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Превращает любое фото в пиксель-арт одной функцией. Сделано для мастер-классов по Python.
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: pixel art,image,pillow,education,kids
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
10
|
+
Classifier: Intended Audience :: Education
|
|
11
|
+
Requires-Python: >=3.8
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: Pillow>=9.1
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest; extra == "dev"
|
|
17
|
+
Requires-Dist: build; extra == "dev"
|
|
18
|
+
Requires-Dist: twine; extra == "dev"
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
|
|
21
|
+
# pixelkid
|
|
22
|
+
|
|
23
|
+
Превращает любое фото в пиксель-арт **одной функцией**. Сделано для мастер-классов по Python (возраст 11–17).
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from pixelkid import pixelate
|
|
27
|
+
|
|
28
|
+
pixelate("photo.jpg", pixel_size=12, colors=16, save_as="art.png")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Установка
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
pip install pixelkid
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Нужен Python 3.8+. Вместе с `pixelkid` автоматически установится Pillow.
|
|
38
|
+
|
|
39
|
+
## Функция `pixelate`
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
pixelate(image, pixel_size=12, colors=32, save_as=None, upscale=True)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
| Параметр | Что это | По умолчанию |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `image` | Путь к файлу (`"photo.jpg"`) или картинка Pillow (`Image`) | — |
|
|
48
|
+
| `pixel_size` | Размер «большого пикселя» в обычных пикселях, от 2. Чем больше — тем крупнее квадраты | `12` |
|
|
49
|
+
| `colors` | Сколько цветов оставить, от 2 до 256 | `32` |
|
|
50
|
+
| `save_as` | Куда сохранить результат. Если не указать — файл не создаётся | `None` |
|
|
51
|
+
| `upscale` | `True` — картинка исходного размера с крупными пикселями. `False` — маленькая картинка, где 1 точка = 1 большой пиксель | `True` |
|
|
52
|
+
|
|
53
|
+
**Возвращает** картинку Pillow (`PIL.Image.Image`), поэтому её можно показать (`.show()`), сохранить (`.save(...)`) или обработать дальше.
|
|
54
|
+
|
|
55
|
+
**Ошибки.** Если `pixel_size` меньше 2 или `colors` вне диапазона 2–256, функция выбросит `ValueError`.
|
|
56
|
+
|
|
57
|
+
## Примеры
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from pixelkid import pixelate
|
|
61
|
+
|
|
62
|
+
# 1. Просто показать результат
|
|
63
|
+
pixelate("cat.jpg").show()
|
|
64
|
+
|
|
65
|
+
# 2. Очень крупные пиксели и всего 4 цвета
|
|
66
|
+
pixelate("cat.jpg", pixel_size=30, colors=4, save_as="cat_8bit.png")
|
|
67
|
+
|
|
68
|
+
# 3. Пять версий одного фото
|
|
69
|
+
for size in (4, 8, 16, 24, 32):
|
|
70
|
+
pixelate("cat.jpg", pixel_size=size, save_as=f"cat_{size}.png")
|
|
71
|
+
|
|
72
|
+
# 4. Маленькая «сетка» для своих игр и раскрасок
|
|
73
|
+
grid = pixelate("cat.jpg", pixel_size=16, upscale=False)
|
|
74
|
+
print(grid.size) # например, (48, 48): можно перебрать каждую клеточку
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Как это работает
|
|
78
|
+
|
|
79
|
+
1. **Уменьшаем** фото: каждый квадрат `pixel_size × pixel_size` становится одной точкой.
|
|
80
|
+
2. **Оставляем** только `colors` цветов (`quantize`).
|
|
81
|
+
3. **Увеличиваем** обратно методом `NEAREST` — он просто копирует цвет и не размывает границы.
|
|
82
|
+
|
|
83
|
+
## Разработка
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
pip install -e .[dev] # или: pip install -e . pytest
|
|
87
|
+
pytest
|
|
88
|
+
python -m build # собрать пакет в папку dist/
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Лицензия
|
|
92
|
+
|
|
93
|
+
MIT
|
pixelkid-0.1.0/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# pixelkid
|
|
2
|
+
|
|
3
|
+
Превращает любое фото в пиксель-арт **одной функцией**. Сделано для мастер-классов по Python (возраст 11–17).
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
from pixelkid import pixelate
|
|
7
|
+
|
|
8
|
+
pixelate("photo.jpg", pixel_size=12, colors=16, save_as="art.png")
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Установка
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
pip install pixelkid
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Нужен Python 3.8+. Вместе с `pixelkid` автоматически установится Pillow.
|
|
18
|
+
|
|
19
|
+
## Функция `pixelate`
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
pixelate(image, pixel_size=12, colors=32, save_as=None, upscale=True)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| Параметр | Что это | По умолчанию |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| `image` | Путь к файлу (`"photo.jpg"`) или картинка Pillow (`Image`) | — |
|
|
28
|
+
| `pixel_size` | Размер «большого пикселя» в обычных пикселях, от 2. Чем больше — тем крупнее квадраты | `12` |
|
|
29
|
+
| `colors` | Сколько цветов оставить, от 2 до 256 | `32` |
|
|
30
|
+
| `save_as` | Куда сохранить результат. Если не указать — файл не создаётся | `None` |
|
|
31
|
+
| `upscale` | `True` — картинка исходного размера с крупными пикселями. `False` — маленькая картинка, где 1 точка = 1 большой пиксель | `True` |
|
|
32
|
+
|
|
33
|
+
**Возвращает** картинку Pillow (`PIL.Image.Image`), поэтому её можно показать (`.show()`), сохранить (`.save(...)`) или обработать дальше.
|
|
34
|
+
|
|
35
|
+
**Ошибки.** Если `pixel_size` меньше 2 или `colors` вне диапазона 2–256, функция выбросит `ValueError`.
|
|
36
|
+
|
|
37
|
+
## Примеры
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
from pixelkid import pixelate
|
|
41
|
+
|
|
42
|
+
# 1. Просто показать результат
|
|
43
|
+
pixelate("cat.jpg").show()
|
|
44
|
+
|
|
45
|
+
# 2. Очень крупные пиксели и всего 4 цвета
|
|
46
|
+
pixelate("cat.jpg", pixel_size=30, colors=4, save_as="cat_8bit.png")
|
|
47
|
+
|
|
48
|
+
# 3. Пять версий одного фото
|
|
49
|
+
for size in (4, 8, 16, 24, 32):
|
|
50
|
+
pixelate("cat.jpg", pixel_size=size, save_as=f"cat_{size}.png")
|
|
51
|
+
|
|
52
|
+
# 4. Маленькая «сетка» для своих игр и раскрасок
|
|
53
|
+
grid = pixelate("cat.jpg", pixel_size=16, upscale=False)
|
|
54
|
+
print(grid.size) # например, (48, 48): можно перебрать каждую клеточку
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Как это работает
|
|
58
|
+
|
|
59
|
+
1. **Уменьшаем** фото: каждый квадрат `pixel_size × pixel_size` становится одной точкой.
|
|
60
|
+
2. **Оставляем** только `colors` цветов (`quantize`).
|
|
61
|
+
3. **Увеличиваем** обратно методом `NEAREST` — он просто копирует цвет и не размывает границы.
|
|
62
|
+
|
|
63
|
+
## Разработка
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
pip install -e .[dev] # или: pip install -e . pytest
|
|
67
|
+
pytest
|
|
68
|
+
python -m build # собрать пакет в папку dist/
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Лицензия
|
|
72
|
+
|
|
73
|
+
MIT
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "pixelkid"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Превращает любое фото в пиксель-арт одной функцией. Сделано для мастер-классов по Python."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
dependencies = ["Pillow>=9.1"]
|
|
13
|
+
keywords = ["pixel art", "image", "pillow", "education", "kids"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"License :: OSI Approved :: MIT License",
|
|
17
|
+
"Topic :: Multimedia :: Graphics",
|
|
18
|
+
"Intended Audience :: Education",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[project.optional-dependencies]
|
|
22
|
+
dev = ["pytest", "build", "twine"]
|
|
23
|
+
|
|
24
|
+
[tool.setuptools.packages.find]
|
|
25
|
+
where = ["src"]
|
pixelkid-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""pixelkid — превращает фото в пиксель-арт одной функцией.
|
|
2
|
+
|
|
3
|
+
from pixelkid import pixelate
|
|
4
|
+
pixelate("photo.jpg", pixel_size=12, colors=16, save_as="art.png")
|
|
5
|
+
"""
|
|
6
|
+
from PIL import Image
|
|
7
|
+
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
__all__ = ["pixelate"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def pixelate(image, pixel_size=12, colors=32, save_as=None, upscale=True):
|
|
13
|
+
"""Делает из фотографии пиксель-арт.
|
|
14
|
+
|
|
15
|
+
image -- путь к файлу ("photo.jpg") или картинка Pillow (Image).
|
|
16
|
+
pixel_size -- размер одного «большого пикселя» в обычных пикселях (2 и больше).
|
|
17
|
+
colors -- сколько цветов оставить (от 2 до 256).
|
|
18
|
+
save_as -- куда сохранить результат ("art.png"). Если не нужно -- не указывай.
|
|
19
|
+
upscale -- True: вернуть картинку исходного размера с крупными пикселями;
|
|
20
|
+
False: вернуть маленькую картинку, где 1 точка = 1 большой пиксель.
|
|
21
|
+
|
|
22
|
+
Возвращает картинку Pillow (Image).
|
|
23
|
+
"""
|
|
24
|
+
if pixel_size < 2:
|
|
25
|
+
raise ValueError("pixel_size должен быть 2 или больше")
|
|
26
|
+
if not 2 <= colors <= 256:
|
|
27
|
+
raise ValueError("colors должен быть от 2 до 256")
|
|
28
|
+
|
|
29
|
+
if isinstance(image, Image.Image):
|
|
30
|
+
photo = image.convert("RGB")
|
|
31
|
+
else:
|
|
32
|
+
photo = Image.open(image).convert("RGB")
|
|
33
|
+
|
|
34
|
+
# 1. Уменьшаем: каждый квадрат pixel_size x pixel_size станет одной точкой
|
|
35
|
+
small_size = (max(1, photo.width // pixel_size), max(1, photo.height // pixel_size))
|
|
36
|
+
small = photo.resize(small_size, Image.Resampling.LANCZOS)
|
|
37
|
+
|
|
38
|
+
# 2. Оставляем только нужное количество цветов
|
|
39
|
+
small = small.quantize(colors=colors).convert("RGB")
|
|
40
|
+
|
|
41
|
+
# 3. Увеличиваем обратно без размытия
|
|
42
|
+
result = small.resize(photo.size, Image.Resampling.NEAREST) if upscale else small
|
|
43
|
+
|
|
44
|
+
if save_as:
|
|
45
|
+
result.save(save_as)
|
|
46
|
+
return result
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pixelkid
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Превращает любое фото в пиксель-арт одной функцией. Сделано для мастер-классов по Python.
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: pixel art,image,pillow,education,kids
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
10
|
+
Classifier: Intended Audience :: Education
|
|
11
|
+
Requires-Python: >=3.8
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: Pillow>=9.1
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest; extra == "dev"
|
|
17
|
+
Requires-Dist: build; extra == "dev"
|
|
18
|
+
Requires-Dist: twine; extra == "dev"
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
|
|
21
|
+
# pixelkid
|
|
22
|
+
|
|
23
|
+
Превращает любое фото в пиксель-арт **одной функцией**. Сделано для мастер-классов по Python (возраст 11–17).
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from pixelkid import pixelate
|
|
27
|
+
|
|
28
|
+
pixelate("photo.jpg", pixel_size=12, colors=16, save_as="art.png")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Установка
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
pip install pixelkid
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Нужен Python 3.8+. Вместе с `pixelkid` автоматически установится Pillow.
|
|
38
|
+
|
|
39
|
+
## Функция `pixelate`
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
pixelate(image, pixel_size=12, colors=32, save_as=None, upscale=True)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
| Параметр | Что это | По умолчанию |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `image` | Путь к файлу (`"photo.jpg"`) или картинка Pillow (`Image`) | — |
|
|
48
|
+
| `pixel_size` | Размер «большого пикселя» в обычных пикселях, от 2. Чем больше — тем крупнее квадраты | `12` |
|
|
49
|
+
| `colors` | Сколько цветов оставить, от 2 до 256 | `32` |
|
|
50
|
+
| `save_as` | Куда сохранить результат. Если не указать — файл не создаётся | `None` |
|
|
51
|
+
| `upscale` | `True` — картинка исходного размера с крупными пикселями. `False` — маленькая картинка, где 1 точка = 1 большой пиксель | `True` |
|
|
52
|
+
|
|
53
|
+
**Возвращает** картинку Pillow (`PIL.Image.Image`), поэтому её можно показать (`.show()`), сохранить (`.save(...)`) или обработать дальше.
|
|
54
|
+
|
|
55
|
+
**Ошибки.** Если `pixel_size` меньше 2 или `colors` вне диапазона 2–256, функция выбросит `ValueError`.
|
|
56
|
+
|
|
57
|
+
## Примеры
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from pixelkid import pixelate
|
|
61
|
+
|
|
62
|
+
# 1. Просто показать результат
|
|
63
|
+
pixelate("cat.jpg").show()
|
|
64
|
+
|
|
65
|
+
# 2. Очень крупные пиксели и всего 4 цвета
|
|
66
|
+
pixelate("cat.jpg", pixel_size=30, colors=4, save_as="cat_8bit.png")
|
|
67
|
+
|
|
68
|
+
# 3. Пять версий одного фото
|
|
69
|
+
for size in (4, 8, 16, 24, 32):
|
|
70
|
+
pixelate("cat.jpg", pixel_size=size, save_as=f"cat_{size}.png")
|
|
71
|
+
|
|
72
|
+
# 4. Маленькая «сетка» для своих игр и раскрасок
|
|
73
|
+
grid = pixelate("cat.jpg", pixel_size=16, upscale=False)
|
|
74
|
+
print(grid.size) # например, (48, 48): можно перебрать каждую клеточку
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Как это работает
|
|
78
|
+
|
|
79
|
+
1. **Уменьшаем** фото: каждый квадрат `pixel_size × pixel_size` становится одной точкой.
|
|
80
|
+
2. **Оставляем** только `colors` цветов (`quantize`).
|
|
81
|
+
3. **Увеличиваем** обратно методом `NEAREST` — он просто копирует цвет и не размывает границы.
|
|
82
|
+
|
|
83
|
+
## Разработка
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
pip install -e .[dev] # или: pip install -e . pytest
|
|
87
|
+
pytest
|
|
88
|
+
python -m build # собрать пакет в папку dist/
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Лицензия
|
|
92
|
+
|
|
93
|
+
MIT
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
src/pixelkid/__init__.py
|
|
5
|
+
src/pixelkid.egg-info/PKG-INFO
|
|
6
|
+
src/pixelkid.egg-info/SOURCES.txt
|
|
7
|
+
src/pixelkid.egg-info/dependency_links.txt
|
|
8
|
+
src/pixelkid.egg-info/requires.txt
|
|
9
|
+
src/pixelkid.egg-info/top_level.txt
|
|
10
|
+
tests/test_pixelate.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pixelkid
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from PIL import Image
|
|
2
|
+
import pytest
|
|
3
|
+
from pixelkid import pixelate
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def make_photo():
|
|
7
|
+
return Image.effect_mandelbrot((200, 150), (-2, -1.5, 1, 1.5), 30)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_keeps_size():
|
|
11
|
+
assert pixelate(make_photo(), pixel_size=10).size == (200, 150)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def test_small_image():
|
|
15
|
+
assert pixelate(make_photo(), pixel_size=10, upscale=False).size == (20, 15)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_color_limit():
|
|
19
|
+
result = pixelate(make_photo(), pixel_size=5, colors=4)
|
|
20
|
+
assert len(result.getcolors(10000)) <= 4
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_save(tmp_path):
|
|
24
|
+
path = tmp_path / "art.png"
|
|
25
|
+
pixelate(make_photo(), save_as=str(path))
|
|
26
|
+
assert path.exists()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_bad_values():
|
|
30
|
+
with pytest.raises(ValueError):
|
|
31
|
+
pixelate(make_photo(), pixel_size=1)
|
|
32
|
+
with pytest.raises(ValueError):
|
|
33
|
+
pixelate(make_photo(), colors=1)
|