Потеря цвета после поворота изображения RGBA с использованием PIL - PullRequest
0 голосов
/ 09 февраля 2020

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

An RGBA image

Но после вращения оно потеряло все значения RGB при альфа = 0.

Rotations

Я пробовал все другие типы повторной выборки для функции rotate (), но они даже ухудшают ситуацию.

Это исходное изображение : http://djosix.com/cell.png

1 Ответ

3 голосов
/ 09 февраля 2020

Краткий ответ:

alpha = image.split()[-1]
image = image.convert('RGB').rotate(angle)
image.putalpha(alpha.rotate(angle))

См. Исходный код:

https://github.com/python-pillow/Pillow/blob/master/src/PIL/Image.py#L2324

In transform(), вызывается rotate():

if self.mode == "RGBA":
    return (
        self.convert("RGBa")
        .transform(size, method, data, resample, fill, fillcolor)
        .convert("RGBA")
    )

Преобразование в RGBa умножит RGB на альфу в соответствии с этой частью:

https://github.com/python-pillow/Pillow/blob/master/src/libImaging/Convert.c#L489

static void
rgbA2rgba(UINT8* out, const UINT8* in, int xsize)
{
    int x;
    unsigned int alpha, tmp;
    for (x = 0; x < xsize; x++) {
        alpha = in[3];
        *out++ = MULDIV255(*in++, alpha, tmp);
        *out++ = MULDIV255(*in++, alpha, tmp);
        *out++ = MULDIV255(*in++, alpha, tmp);
        *out++ = *in++;
    }
}
...