Создает ли PIL артефакт на нижнем краю изображения, когда вы уменьшаете (), а затем обрезаете ()? Если да, то каков ваш обходной путь? - PullRequest
3 голосов
/ 22 февраля 2010

Когда я вызываю PIL для thumbnail () изображения, а затем обрезаю (), я получаю артефакты в последнем ряду пикселей - они либо в основном черные с пятнами интенсивного цвета, либо что-то вроде область изображения с измененным размером (т. е. эта линия пикселей соответствует исходному разрешению и не масштабируется вместе с остальными)

Похоже, что это не происходит на миниатюре () без кадрирования. Это происходит независимо от того, вызываю ли я load () для обрезанного изображения.

Чтобы обойти это визуально, я уменьшил изображение до 1 пикселя большего размера, а затем обрезал до того же размера. Это похоже на работу. Это вроде грязного хака. Мне интересно, если есть правильное решение.

1 Ответ

2 голосов
/ 23 февраля 2010

Да, это происходит и со мной. Это было для меня учебным упражнением, потому что я никогда не обрезал и не создавал эскизы, используя PIL ...

не

уменьшенные изображения (размер, фильтр = None)

Заменяет исходное изображение на место новым изображением заданного размера (стр. 2). Необязательный Аргумент фильтра работает так же, как и в методе .resize (). Соотношение сторон (высота: ширина) сохраняется этой операцией. Полученное изображение будет таким же большим насколько это возможно, при этом не выходя за пределы заданного размера. Например, если изображение имеет размер (400,150), его размер после im.thumbnail ((40,40)) будет (40,15) .

Итак, что происходит

  1. Вы используете миниатюру, которая поддерживает аспект
  2. Вы ожидаете изображение будет 40 х 40
  3. Вы обрезаете сверх фактического размера миниатюры
  4. Черная полоса, скорее всего, снизу из-за обрезки сверх размера

Код, который я написал, чтобы повторить вопрос:

def croptest(file, width, height):
    import Image as pil
    import os

    max_width = width
    max_height = height
    file, ext = os.path.splitext(file)

    img = pil.open(file)
    img.thumbnail((max_width, max_height), pil.ANTIALIAS)
    img.save(file + ".thumb.jpeg", 'JPEG')
    croppedImage = img.crop((10, 10, 40, 40))
    croppedImage.save(file + ".croppedthumb.jpeg", 'JPEG')

if __name__ == "__main__":
   croptest("Desktop.bmp", 50, 50)

Desktop.thumb.jpeg был 50 x 37, тогда как Desktop.croppedthumb.jpeg был 30 x 30, поэтому у меня была черная линия высотой 3 пикселя внизу.

Ваше решение будет заключаться в том, чтобы обрезать внутри фактического размера миниатюры или выяснить, как создать миниатюру, игнорируя соотношение сторон.

...