Python PIL: обрезка изображения с черной областью, если недостаточно области фотографии - PullRequest
1 голос
/ 16 декабря 2011

Я хочу сделать большой палец и обрезать его до нужного размера. Это работает нормально, но если моя новая область большого пальца меньше, чем область обрезки, все пустое пространство заполняется черным цветом. Код:

import os
from PIL import Image

def resize(file_path):
    file, ext = os.path.splitext(file_path)
    im = Image.open(file_path)
    size = (100, 'auto')
    new_path = file + "_.jpg"
    im.thumbnail(size, Image.ANTIALIAS)
    region = im.crop((0, 0, 100, 100))
    region.save(new_path, "JPEG")

Может быть, есть какой-нибудь параметр, например, max_height для метода обрезки или что-то еще?

Спасибо! enter image description here

Ответы [ 4 ]

2 голосов
/ 16 декабря 2011

Вам нужно будет применить какой-то простой алгоритм вместо слепой обрезки.

  • Получите квадрат максимально возможного размера на изображении, центр квадрата которого выровнен по центру изображения. Квадрат максимального размера будет иметь сторону, равную максимальной высоте или ширине изображения.

  • Получив квадрат, измените его размер до размера миниатюр.

  • Это должно работать нормально для большинства изображений, однако, если вы генерируете миниатюры для изображений лиц, это может быть не очень хороший метод, и вам могут потребоваться некоторые методы распознавания лиц для лучшего вывода.
1 голос
/ 16 декабря 2011

Я бы сделал это следующим образом:

  • Если изображение широкое, то масштабируйте его до 100 пикселей в высоту.Если он высокий, увеличьте его до 100px.

  • Вырежьте середину 100x100.

    def resize(file_path):
        file, ext = os.path.splitext(file_path)
        im = Image.open(file_path)
        w, h = im.size
        size = (100, 'auto') if h > w else ('auto', 100)
        new_path = file + "_.jpg"
        im.thumbnail(size, Image.ANTIALIAS)
        w, h = im.size
        region = im.crop((w/2 - 50, h/2 - 50, w/2 + 50, h/2 + 50))
        region.save(new_path, "JPEG")
    
1 голос
/ 16 декабря 2011

Вы пытаетесь обрезать изображение только условно, если оно БОЛЬШЕ, чем 100x100?Если это так,

def resize(file_path):
    file, ext = os.path.splitext(file_path)
    im = Image.open(file_path)
    size = (100, 'auto')
    new_path = file + "_.jpg"
    im.thumbnail(size, Image.ANTIALIAS)
    if im.size[1] > 100:
        im = im.crop((0, 0, 100, 100))
    im.save(new_path, "JPEG")
0 голосов
/ 16 декабря 2011

Я нашел решение:

import os
from PIL import Image

def resize(file_path):
    file, ext = os.path.splitext(file_path)
    im = Image.open(file_path)
    size = (100, 'auto')
    new_path = file + "_.jpg"
    im.thumbnail(size)
    (width, height) = im.size
    if height >= width: box = (0, 0, 100, 100)
    else: box = (0, 0, 100, height)
    region = im.crop(box)
    region.save(new_path, "JPEG")

Спасибо за ваши ответы!

...