File: test_image_thumbnail.py

package info (click to toggle)
pillow 8.1.2%2Bdfsg-0.3%2Bdeb11u2
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 65,628 kB
  • sloc: python: 35,630; ansic: 31,009; makefile: 388; javascript: 114; sh: 77
file content (131 lines) | stat: -rw-r--r-- 3,663 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import pytest

from PIL import Image

from .helper import (
    assert_image_equal,
    assert_image_similar,
    fromstring,
    hopper,
    tostring,
)


def test_sanity():
    im = hopper()
    assert im.thumbnail((100, 100)) is None

    assert im.size == (100, 100)


def test_aspect():
    im = Image.new("L", (128, 128))
    im.thumbnail((100, 100))
    assert im.size == (100, 100)

    im = Image.new("L", (128, 256))
    im.thumbnail((100, 100))
    assert im.size == (50, 100)

    im = Image.new("L", (128, 256))
    im.thumbnail((50, 100))
    assert im.size == (50, 100)

    im = Image.new("L", (256, 128))
    im.thumbnail((100, 100))
    assert im.size == (100, 50)

    im = Image.new("L", (256, 128))
    im.thumbnail((100, 50))
    assert im.size == (100, 50)

    im = Image.new("L", (64, 64))
    im.thumbnail((100, 100))
    assert im.size == (64, 64)

    im = Image.new("L", (256, 162))  # ratio is 1.5802469136
    im.thumbnail((33, 33))
    assert im.size == (33, 21)  # ratio is 1.5714285714

    im = Image.new("L", (162, 256))  # ratio is 0.6328125
    im.thumbnail((33, 33))
    assert im.size == (21, 33)  # ratio is 0.6363636364

    im = Image.new("L", (145, 100))  # ratio is 1.45
    im.thumbnail((50, 50))
    assert im.size == (50, 34)  # ratio is 1.47058823529

    im = Image.new("L", (100, 145))  # ratio is 0.689655172414
    im.thumbnail((50, 50))
    assert im.size == (34, 50)  # ratio is 0.68

    im = Image.new("L", (100, 30))  # ratio is 3.333333333333
    im.thumbnail((75, 75))
    assert im.size == (75, 23)  # ratio is 3.260869565217


def test_division_by_zero():
    im = Image.new("L", (200, 2))
    im.thumbnail((75, 75))
    assert im.size == (75, 1)


def test_float():
    im = Image.new("L", (128, 128))
    im.thumbnail((99.9, 99.9))
    assert im.size == (99, 99)


def test_no_resize():
    # Check that draft() can resize the image to the destination size
    with Image.open("Tests/images/hopper.jpg") as im:
        im.draft(None, (64, 64))
        assert im.size == (64, 64)

    # Test thumbnail(), where only draft() is necessary to resize the image
    with Image.open("Tests/images/hopper.jpg") as im:
        im.thumbnail((64, 64))
        assert im.size == (64, 64)


def test_DCT_scaling_edges():
    # Make an image with red borders and size (N * 8) + 1 to cross DCT grid
    im = Image.new("RGB", (257, 257), "red")
    im.paste(Image.new("RGB", (235, 235)), (11, 11))

    thumb = fromstring(tostring(im, "JPEG", quality=99, subsampling=0))
    # small reducing_gap to amplify the effect
    thumb.thumbnail((32, 32), Image.BICUBIC, reducing_gap=1.0)

    ref = im.resize((32, 32), Image.BICUBIC)
    # This is still JPEG, some error is present. Without the fix it is 11.5
    assert_image_similar(thumb, ref, 1.5)


def test_reducing_gap_values():
    im = hopper()
    im.thumbnail((18, 18), Image.BICUBIC)

    ref = hopper()
    ref.thumbnail((18, 18), Image.BICUBIC, reducing_gap=2.0)
    # reducing_gap=2.0 should be the default
    assert_image_equal(ref, im)

    ref = hopper()
    ref.thumbnail((18, 18), Image.BICUBIC, reducing_gap=None)
    with pytest.raises(AssertionError):
        assert_image_equal(ref, im)

    assert_image_similar(ref, im, 3.5)


def test_reducing_gap_for_DCT_scaling():
    with Image.open("Tests/images/hopper.jpg") as ref:
        # thumbnail should call draft with reducing_gap scale
        ref.draft(None, (18 * 3, 18 * 3))
        ref = ref.resize((18, 18), Image.BICUBIC)

        with Image.open("Tests/images/hopper.jpg") as im:
            im.thumbnail((18, 18), Image.BICUBIC, reducing_gap=3.0)

            assert_image_equal(ref, im)