Вертикальное увядание изображения с прозрачностью с использованием PIL-библиотеки Python

Я просмотрел учебники, другие вопросы о стеке и документацию PIL, но я все еще не уверен, как это сделать.

Я хотел бы начать затухать изображение вертикально примерно на 55% вниз по оси Y, и изображение будет полностью прозрачным примерно на 75%. Важно, чтобы я сохранил всю высоту изображения, хотя последние 25% или около того должны быть полностью прозрачными.

Возможно ли это с PIL?

3 Solutions collect form web for “Вертикальное увядание изображения с прозрачностью с использованием PIL-библиотеки Python”

Конечно, это выполнимо.

Предположим, что вы начинаете с изображения без прозрачности (потому что в противном случае ваш вопрос неоднозначен).

Шаг 1. Добавьте альфа-плоскость. Это просто putalpha , если вы не имеете дело с непланарным изображением, и в этом случае вам нужно сначала преобразовать его в RGB или L.

Шаг 2: Итерируйте через пиксели, которые вы хотите изменить, используя массив пикселей, возвращаемый load (или getpixel и setpixel если вам нужно иметь дело с древними версиями PIL).

Шаг 3: Нет шага 3. Если вы не подсчитаете сохранение изображения. В этом случае, OK, шаг 3 сохраняет изображение.

 from PIL import Image im = Image.open('bird.jpg') im.putalpha(255) width, height = im.size pixels = im.load() for y in range(int(height*.55), int(height*.75)): alpha = 255-int((y - height*.55)/height/.20 * 255) for x in range(width): pixels[x, y] = pixels[x, y][:3] + (alpha,) for y in range(y, height): for x in range(width): pixels[x, y] = pixels[x, y][:3] + (0,) im.save('birdfade.png') 

Здесь альфа падает линейно от 255 до 0; вы хотите, чтобы он упал по другой кривой, или вы используете RGB16 вместо RGB8, или используете L вместо RGB, вы должны выяснить, как его изменить.


Если вы хотите сделать это быстрее, вы можете использовать numpy вместо цикла Python для шага 2. Или вы можете отменить шаги 1 и 2 – заранее создать альфа-плоскость и применить ее все сразу, передав ее вместо putalpha вместо 255 . Или … Поскольку это заняло полсекунды на самом большом изображении, с которым я лежал, я не слишком беспокоюсь о производительности, если вам не нужно сделать миллион из них, и вам нужна более быстрая версия.

Использование NumPy:

 import numpy as np import Image img = Image.open(FILENAME).convert('RGBA') arr = np.array(img) alpha = arr[:, :, 3] n = len(alpha) alpha[:] = np.interp(np.arange(n), [0, 0.55*n, 0.75*n, n], [255, 255, 0, 0])[:,np.newaxis] img = Image.fromarray(arr, mode='RGBA') img.save('/tmp/out.png') 

Вам нужно немного изменить код @abarnert, если вы хотите угаснуть изображение, у которого уже был прозрачный фон ( деталь ):

 from PIL import Image im = Image.open('bird.jpg') width, height = im.size pixels = im.load() for y in range(int(height*.55), int(height*.75)): for x in range(width): alpha = pixels[x, y][3]-int((y - height*.55)/height/.20 * 255) # change made here if alpha <= 0: alpha = 0 pixels[x, y] = pixels[x, y][:3] + (alpha,) for y in range(y, height): for x in range(width): pixels[x, y] = pixels[x, y][:3] + (0,) bg.save('birdfade.png') 
Python - лучший язык программирования в мире.