Подушка Rotate теряет альфа-значения - PullRequest
0 голосов
/ 01 декабря 2018

Я использую альфа-значение определенных пикселей, чтобы отслеживать их положение во время поворота.Я заметил, что в некоторых случаях я теряю установленное значение Alpha.Пример кода, показывающий проблему:

 def showAlphas(rotation, img):
        imgPixels = img.load()
        foundAlpha = False
        for w in range(0, img.width):
            for h in range(0, img.height):
                if imgPixels[w, h][3]==50:
                    print 'Found at {}, {} in Rotation {}'.format(w, h, rotation)
                    foundAlpha = True
        if not foundAlpha:
            print 'Alpha missing from rotation {}'.format(rotation)

img = Image.new('RGBA', (100, 50), color='black')
img.putpixel((10, 10), (255, 0, 0, 50))

for x in range(1, 360, 1):
        rotated = img.rotate(x, expand=True)
        showAlphas(x, rotated)

Пример вывода:

Found at 96, 41 in Rotation 194
Found at 96, 41 in Rotation 195
Alpha missing from rotation 196
Found at 98, 41 in Rotation 197
Found at 97, 41 in Rotation 198
Found at 98, 41 in Rotation 198
Alpha missing from rotation 199
Alpha missing from rotation 200
Found at 98, 41 in Rotation 201
Found at 97, 40 in Rotation 202
Found at 98, 40 in Rotation 202

Использование подушки 5.3.0

Что-то не так в повороте?Насколько я знаю, Expand = True - единственная опция, которую мне нужно указать (чтобы изображение не обрезалось в определенных ориентациях)?

Я не привязан к использованию подушки, но мне нужно что-то отслеживатьконкретные координаты пикселей в различных операциях изменения размера и поворота, а также при использовании Pillow и отслеживания альфа-значений, будут делать это.Я действительно не хочу пытаться отслеживать значения RGB, но боюсь, что это может быть связано с той же проблемой.Любые другие предложения?

1 Ответ

0 голосов
/ 02 декабря 2018

Не уверен, что я настолько хорош, чтобы иллюстрировать то, что я говорил в комментариях - я надеялся найти блестящую анимацию в Википедии, но с треском провалился.В любом случае, я говорил о том, что нет взаимно-однозначного соответствия между пикселями во входном изображении и пикселями в выходном изображении после поворота.

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

В любом случае, вот изображение, которое я сделал, пытаясь проиллюстрировать поворот.У вас есть два изображения, одно красное, другое черное, а пиксели находятся на пересечении линий.Одно изображение поворачивается над другим вокруг центрального пикселя, так что оно совпадает с черным и красным изображением.

Посмотрите на пиксель, который я выделил зеленым.Он не попадает в выходное изображение, потому что все 4 угла вокруг него расположены ближе к другим пикселям исходного изображения.Итак, я говорю, что исходные пиксели прыгают вдоль синих линий в выходное изображение, но зеленые не дают этого ... надеюсь, вы поняли!

enter image description here

...