Pillow

Форк
0
/
test_imagedraw2.py 
276 строк · 6.6 Кб
1
from __future__ import annotations
2

3
import os.path
4

5
import pytest
6

7
from PIL import Image, ImageDraw, ImageDraw2, features
8
from PIL._typing import Coords
9

10
from .helper import (
11
    assert_image_equal,
12
    assert_image_equal_tofile,
13
    assert_image_similar_tofile,
14
    hopper,
15
    skip_unless_feature,
16
)
17

18
BLACK = (0, 0, 0)
19
WHITE = (255, 255, 255)
20
GRAY = (190, 190, 190)
21
DEFAULT_MODE = "RGB"
22
IMAGES_PATH = os.path.join("Tests", "images", "imagedraw")
23

24
# Image size
25
W, H = 100, 100
26

27
# Bounding box points
28
X0 = int(W / 4)
29
X1 = int(X0 * 3)
30
Y0 = int(H / 4)
31
Y1 = int(X0 * 3)
32

33
# Bounding boxes
34
BBOX = (((X0, Y0), (X1, Y1)), [(X0, Y0), (X1, Y1)], (X0, Y0, X1, Y1), [X0, Y0, X1, Y1])
35

36
# Coordinate sequences
37
POINTS = (
38
    ((10, 10), (20, 40), (30, 30)),
39
    [(10, 10), (20, 40), (30, 30)],
40
    (10, 10, 20, 40, 30, 30),
41
    [10, 10, 20, 40, 30, 30],
42
)
43

44
FONT_PATH = "Tests/fonts/FreeMono.ttf"
45

46

47
def test_sanity() -> None:
48
    im = hopper("RGB").copy()
49

50
    draw = ImageDraw2.Draw(im)
51
    pen = ImageDraw2.Pen("blue", width=7)
52
    draw.line(list(range(10)), pen)
53

54
    draw2, handler = ImageDraw.getdraw(im)
55
    assert draw2 is not None
56
    pen = ImageDraw2.Pen("blue", width=7)
57
    draw2.line(list(range(10)), pen)
58

59

60
def test_mode() -> None:
61
    draw = ImageDraw2.Draw("L", (1, 1))
62
    assert draw.image.mode == "L"
63

64
    with pytest.raises(ValueError):
65
        ImageDraw2.Draw("L")
66

67

68
@pytest.mark.parametrize("bbox", BBOX)
69
@pytest.mark.parametrize("start, end", ((0, 180), (0.5, 180.4)))
70
def test_arc(bbox: Coords, start: float, end: float) -> None:
71
    # Arrange
72
    im = Image.new("RGB", (W, H))
73
    draw = ImageDraw2.Draw(im)
74
    pen = ImageDraw2.Pen("white", width=1)
75

76
    # Act
77
    draw.arc(bbox, pen, start, end)
78

79
    # Assert
80
    assert_image_similar_tofile(im, "Tests/images/imagedraw_arc.png", 1)
81

82

83
@pytest.mark.parametrize("bbox", BBOX)
84
def test_chord(bbox: Coords) -> None:
85
    # Arrange
86
    im = Image.new("RGB", (W, H))
87
    draw = ImageDraw2.Draw(im)
88
    pen = ImageDraw2.Pen("yellow")
89
    brush = ImageDraw2.Brush("red")
90

91
    # Act
92
    draw.chord(bbox, pen, 0, 180, brush)
93

94
    # Assert
95
    assert_image_similar_tofile(im, "Tests/images/imagedraw_chord_RGB.png", 1)
96

97

98
@pytest.mark.parametrize("bbox", BBOX)
99
def test_ellipse(bbox: Coords) -> None:
100
    # Arrange
101
    im = Image.new("RGB", (W, H))
102
    draw = ImageDraw2.Draw(im)
103
    pen = ImageDraw2.Pen("blue", width=2)
104
    brush = ImageDraw2.Brush("green")
105

106
    # Act
107
    draw.ellipse(bbox, pen, brush)
108

109
    # Assert
110
    assert_image_similar_tofile(im, "Tests/images/imagedraw_ellipse_RGB.png", 1)
111

112

113
def test_ellipse_edge() -> None:
114
    # Arrange
115
    im = Image.new("RGB", (W, H))
116
    draw = ImageDraw2.Draw(im)
117
    brush = ImageDraw2.Brush("white")
118

119
    # Act
120
    draw.ellipse(((0, 0), (W - 1, H - 1)), brush)
121

122
    # Assert
123
    assert_image_similar_tofile(im, "Tests/images/imagedraw_ellipse_edge.png", 1)
124

125

126
@pytest.mark.parametrize("points", POINTS)
127
def test_line(points: Coords) -> None:
128
    # Arrange
129
    im = Image.new("RGB", (W, H))
130
    draw = ImageDraw2.Draw(im)
131
    pen = ImageDraw2.Pen("yellow", width=2)
132

133
    # Act
134
    draw.line(points, pen)
135

136
    # Assert
137
    assert_image_equal_tofile(im, "Tests/images/imagedraw_line.png")
138

139

140
@pytest.mark.parametrize("points", POINTS)
141
def test_line_pen_as_brush(points: Coords) -> None:
142
    # Arrange
143
    im = Image.new("RGB", (W, H))
144
    draw = ImageDraw2.Draw(im)
145
    pen = None
146
    brush = ImageDraw2.Pen("yellow", width=2)
147

148
    # Act
149
    # Pass in the pen as the brush parameter
150
    draw.line(points, pen, brush)
151

152
    # Assert
153
    assert_image_equal_tofile(im, "Tests/images/imagedraw_line.png")
154

155

156
@pytest.mark.parametrize("bbox", BBOX)
157
@pytest.mark.parametrize("start, end", ((-92, 46), (-92.2, 46.2)))
158
def test_pieslice(bbox: Coords, start: float, end: float) -> None:
159
    # Arrange
160
    im = Image.new("RGB", (W, H))
161
    draw = ImageDraw2.Draw(im)
162
    pen = ImageDraw2.Pen("blue")
163
    brush = ImageDraw2.Brush("white")
164

165
    # Act
166
    draw.pieslice(bbox, pen, start, end, brush)
167

168
    # Assert
169
    assert_image_similar_tofile(im, "Tests/images/imagedraw_pieslice.png", 1)
170

171

172
@pytest.mark.parametrize("points", POINTS)
173
def test_polygon(points: Coords) -> None:
174
    # Arrange
175
    im = Image.new("RGB", (W, H))
176
    draw = ImageDraw2.Draw(im)
177
    pen = ImageDraw2.Pen("blue", width=2)
178
    brush = ImageDraw2.Brush("red")
179

180
    # Act
181
    draw.polygon(points, pen, brush)
182

183
    # Assert
184
    assert_image_equal_tofile(im, "Tests/images/imagedraw_polygon.png")
185

186

187
@pytest.mark.parametrize("bbox", BBOX)
188
def test_rectangle(bbox: Coords) -> None:
189
    # Arrange
190
    im = Image.new("RGB", (W, H))
191
    draw = ImageDraw2.Draw(im)
192
    pen = ImageDraw2.Pen("green", width=2)
193
    brush = ImageDraw2.Brush("black")
194

195
    # Act
196
    draw.rectangle(bbox, pen, brush)
197

198
    # Assert
199
    assert_image_equal_tofile(im, "Tests/images/imagedraw_rectangle.png")
200

201

202
def test_big_rectangle() -> None:
203
    # Test drawing a rectangle bigger than the image
204
    # Arrange
205
    im = Image.new("RGB", (W, H))
206
    bbox = [(-1, -1), (W + 1, H + 1)]
207
    brush = ImageDraw2.Brush("orange")
208
    draw = ImageDraw2.Draw(im)
209
    expected = "Tests/images/imagedraw_big_rectangle.png"
210

211
    # Act
212
    draw.rectangle(bbox, brush)
213

214
    # Assert
215
    assert_image_similar_tofile(im, expected, 1)
216

217

218
@skip_unless_feature("freetype2")
219
def test_text() -> None:
220
    # Arrange
221
    im = Image.new("RGB", (W, H))
222
    draw = ImageDraw2.Draw(im)
223
    font = ImageDraw2.Font("white", FONT_PATH)
224
    expected = "Tests/images/imagedraw2_text.png"
225

226
    # Act
227
    draw.text((5, 5), "ImageDraw2", font)
228

229
    # Assert
230
    assert_image_similar_tofile(im, expected, 13)
231

232

233
@skip_unless_feature("freetype2")
234
def test_textbbox() -> None:
235
    # Arrange
236
    im = Image.new("RGB", (W, H))
237
    draw = ImageDraw2.Draw(im)
238
    font = ImageDraw2.Font("white", FONT_PATH)
239

240
    # Act
241
    bbox = draw.textbbox((0, 0), "ImageDraw2", font)
242

243
    # Assert
244
    right = 72 if features.check_feature("raqm") else 70
245
    assert bbox == (0, 2, right, 12)
246

247

248
@skip_unless_feature("freetype2")
249
def test_textsize_empty_string() -> None:
250
    # Arrange
251
    im = Image.new("RGB", (W, H))
252
    draw = ImageDraw2.Draw(im)
253
    font = ImageDraw2.Font("white", FONT_PATH)
254

255
    # Act
256
    # Should not cause 'SystemError: <built-in method getsize of
257
    # ImagingFont object at 0x...> returned NULL without setting an error'
258
    draw.textbbox((0, 0), "", font)
259
    draw.textbbox((0, 0), "\n", font)
260
    draw.textbbox((0, 0), "test\n", font)
261
    draw.textlength("", font)
262

263

264
@skip_unless_feature("freetype2")
265
def test_flush() -> None:
266
    # Arrange
267
    im = Image.new("RGB", (W, H))
268
    draw = ImageDraw2.Draw(im)
269
    font = ImageDraw2.Font("white", FONT_PATH)
270

271
    # Act
272
    draw.text((5, 5), "ImageDraw2", font)
273
    im2 = draw.flush()
274

275
    # Assert
276
    assert_image_equal(im, im2)
277

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.