Почему эта функция добавляет границу ко всем моим изображениям? - PullRequest
2 голосов
/ 24 января 2011

Я использую PIL.

im = im.rotate(angle=-90, expand = True)

Когда я делаю это, к моему изображению добавляется сероватая рамка.

Почему?

Вот полный код. Обратите внимание, что если я не поверну, это не добавляет границ

def fixRotation(f, quality=96, image_type="JPEG"):
    #http://sylvana.net/jpegcrop/exif_orientation.html
    d =getEXIF(f)
    if d:
        orientation = int(d['Orientation'])
        im = Image.open(StringIO(f))
        if orientation == 6:
            im = im.rotate(angle=-90, expand = True)
        elif orientation == 3:
            im = im.rotate(angle=-180, expand=True)
        elif orientation == 8:
            im = im.rotate(angle=-270, expand=True)
        else:
            #It doesn't add a border here.
            im = im.rotate(0, expand=True)
        res = StringIO()
        im.save(res, image_type, quality=quality)
        res.seek(0)
        return res
    else:
        return StringIO(f)

Ответы [ 3 ]

1 голос
/ 24 января 2011

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

Если вам нужно только k * 90 градусов, то для поворота вы также можете использовать numpy ...

img = Image.fromarray(numpy.rot90(numpy.array(img), n))

n - количество поворотов на 90 градусов.

0 голосов
/ 19 июня 2011

При вращении алгоритм (по существу) усредняет каждый пиксель со значением «следующего» пикселя.Для всех пикселей «внутри» изображения определяется следующий пиксель.Для всех пикселей на краю изображения этот пиксель не определен.

Таким образом, серый - это среднее между известным пикселем периметра и неопределенным внешним пикселем.

0 голосов
/ 17 февраля 2011

Обратите внимание на следующее (CPython 2.6, PIL 1.1.7):

import Image
i= Image.open("someimage.jpg")
ir0= i.rotate(-90)
ir1= i.rotate(-90, expand=1)

for img in i, ir0, ir1:
    print(img.size)

# output follows
(720, 400)
(400, 720)
(401, 721)
  1. Когда angle кратно 90, expand не требуется.
  2. expand в случае угловых коэффициентов, по-видимому, активирует ошибку

Итак, если все, что вам нужно, это повороты на 90 ° -180 ° -270 °, просто пропустите аргумент expand=1; еще лучше использовать метод transpose (см. Геометрические преобразования в руководстве PIL )

...