Как обрезать изображение с соотношением сторон 1: 1, используя подушку в Python? - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь обрезать изображение с соотношением сторон 1: 1 с помощью следующего кода.

from PIL import Image

def crop_image(image):
    width, height = image.size
    print(width, height)
    aspect_ratio = width/float(height)

    if aspect_ratio < 1:
        bottom_offset = height/2 - width/2
        top = height - bottom_offset
        bottom = top + width
        left = 0
        right = left+width
        print((top, bottom, left, right))
        new_image = image.crop((left,top, right, bottom))
        print(new_image.size)
        new_image.save("new.jpg")

image = Image.open('test.jpg')
crop_image(image)

, но это не дает мне правильного вывода. Я использую следующее изображение: input

, и оно дает мне следующий вывод: output

это дает мне правильные размеры, но не правый вывод.

1 Ответ

0 голосов
/ 14 апреля 2020

Просто сравните ширину и высоту, чтобы найти, какая сторона должна быть нарезана. Смещение кадрирования двух боковых границ равно разнице, деленной на 2.

Numpy

from PIL import Image
import numpy as np
def crop_image(img):
    width, height = image.size
    if width == height:
        return img
    img = np.array(img)
    offset  = int(abs(height-width)/2)
    if width>height:
        img = img[:,offset:(width-offset),:]
    else:
        img = img[offset:(height-offset),:,:]
    return Image.fromarray(img)

image = Image.open(r"test.jpg")
crop_image(image)

PIL

from PIL import Image
image = Image.open(r"test.jpg")
def crop_image(image):
    width, height = image.size
    if width == height:
        return image
    offset  = int(abs(height-width)/2)
    if width>height:
        image = image.crop([offset,0,width-offset,height])
    else:
        image = image.crop([0,offset,width,height-offset])
    return image
image = Image.open(r"test.jpg")
crop_image(image)
...