@Wynell_ru

Как работает PIL.Image.PERSPECTIVE?

Добрый день.
Начал изучать Pillow и возник такой вопрос:
Как работает PIL.Image.PERSPECTIVE режим в img.transform?
img = Image.new("RGB", (100, 100), (155, 155, 155))
draw = ImageDraw.Draw(img)
draw.text((0, 90), "LOLOLOLOLOLOLOL!", font=font)
draw.text((0, 80), "LOLOLOLOLOLOLOL!", font=font)
draw.text((0, 70), "LOLOLOLOLOLOLOL!", font=font)
draw.text((0, 60), "LOLOLOLOLOLOLOL!", font=font)
draw.text((0, 50), "LOLOLOLOLOLOLOL!", font=font)
img.transform((100, 100), Image.PERSPECTIVE, (25, 25, 25, 75, 75, 75, 75, 25))

Я думал, что он "перемещает" углы картинки в соответствующие координаты, но видимо, это не так...
gzOzXPw.png
  • Вопрос задан
  • 344 просмотра
Решения вопроса 1
@o5a
Нет, там указываются не координаты, а коэффициенты уравнения (a x + b y + c)/(g x + h y + 1), (d x + e y + f)/(g x + h y + 1), высчитывает координаты, откуда взять значение для каждого пикселя (x, y).
Из документации пакета:
Data is a 8-tuple (a, b, c, d, e, f, g, h) which contains the coefficients for a perspective transform. For each pixel (x, y) in the output image, the new value is taken from a position (a x + b y + c)/(g x + h y + 1), (d x + e y + f)/(g x + h y + 1) in the input image, rounded to nearest pixel.

Исходя из этого, можно составить простые примеры:
(1, 0, 0, 0, 1, 0, 0, 0) - не изменит картинку
(1, 0, 0, 0, 2, 0, 0, 0) - "сплющит" картинку в 2 раза по вертикали, и т.д.

Чтобы найти эти коэффициенты можно воспользоваться вспомогательной функцией, например, отсюда https://stackoverflow.com/a/14178717
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы