Ваш код на самом деле делает то, что он говорит, что это делает. Однако, если ваш фоновый фон не черный, а белый, изображение станет светлее. Следующий код объединяет исходное изображение с черным изображением, так что у вас есть эффект темного градиента независимо от фона.
def test(path):
im = Image.open(path)
if im.mode != 'RGBA':
im = im.convert('RGBA')
width, height = im.size
gradient = Image.new('L', (width, 1), color=0xFF)
for x in range(width):
gradient.putpixel((x, 0), 255-x)
alpha = gradient.resize(im.size)
black_im = Image.new('RGBA', (width, height), color=0) # i.e. black
black_im.putalpha(alpha)
gradient_im = Image.alpha_composite(im, black_im)
gradient_im.save('out.png', 'PNG')
EDIT
Существуют различные способы, чтобы масштабировать градиент. Ниже приведено одно предложение.
def test(path, gradient_magnitude=1.):
im = Image.open(path)
if im.mode != 'RGBA':
im = im.convert('RGBA')
width, height = im.size
gradient = Image.new('L', (width, 1), color=0xFF)
for x in range(width):
# gradient.putpixel((x, 0), 255-x)
gradient.putpixel((x, 0), int(255 * (1 - gradient_magnitude * float(x)/width)))
alpha = gradient.resize(im.size)
black_im = Image.new('RGBA', (width, height), color=0) # i.e. black
black_im.putalpha(alpha)
gradient_im = Image.alpha_composite(im, black_im)
gradient_im.save('out.png', 'PNG')
Спасибо. Кажется, это работает. Но как я могу контролировать размер градиента? Мне не нужен градиент при полном размере изображения. – saa
Извините, я пропустил gradient_magnitude, кажется, все в порядке, я должен играть с ним больше. Благодаря! – saa
Возможно, вы знаете. Как добавить дополнительную непрозрачность? Просто на левой стороне он очень черный. – saa