Python Жезл - Обрезать до соотношения? - PullRequest
0 голосов
/ 26 мая 2020

С Imagemagick вы можете просто сделать:

convert in.png -crop 16:9 out.png

Сначала я подумал, что

Image.transform(crop="16:9")

подойдет, но он просто изменяет размер изображения до 16x9 пикселей, но используя Соотношение сторон при изменении размера по какой-то причине работает нормально. Ничего другого я не могу найти в документации.

1 Ответ

0 голосов
/ 27 мая 2020

Похоже, что функция аспекта не была включена для преобразования кадрирования. К счастью, расчет крысы ios прост и понятен.

import math

def calculate_image_aspect(image, width, height):
    geometry_ratio = float(width)
    columns = float(image.width)
    rows = float(image.height)
    image_ratio = columns / rows
    if geometry_ratio >= image_ratio:
        new_width = columns
        new_height = math.floor(rows * image_ratio / geometry_ratio + 0.5) * height
    else:
        new_width = math.floor(columns * geometry_ratio / image_ratio + 0.5) * height
        new_height = rows
    return (int(new_width), int(new_height))

Скопировано из MagickCore/geometry.c, но я уверен, что есть более быстрые способы в Python.

from wand.image import Image

with Image(filename="wizard:") as img:
    new_width, new_height = calculate_image_aspect(img, 16.0, 9.0)
    img.crop(width=new_width, height=new_height)
    img.border('red', 1, 1)
    img.save(filename="wizard.png")

wizard.png

with Image(filename="logo:") as img:
    new_width, new_height = calculate_image_aspect(img, 16.0, 9.0)
    img.crop(width=new_width, height=new_height)
    img.border('red', 1, 1)
    img.save(filename="logo.png")

logo.png

...