У меня есть изображение, созданное в библиотеке PIL, и есть второе изображение.
Мне нужно взять второе изображение, сделать этот крестик, например красным, и применить его к общему контуру. Как правильно заменить цвет, но не напрямую (FFF на F00), а оставив тени и трехмерный эффект?
Где второе изображение? Как будет выглядеть результат, когда вы это сделаете? Какой код вы пробовали?
Крест — второе изображение. Первый — это чистый холст, на котором мне нужно разместить зеленый, красный и синий кресты.






Вот шаги:
ImageOps.colorize(..., white='red'), чтобы изображение менялось от черного к красному, а не от черного к беломуImage.new()paste(..., mask=originalImage) — маска гарантирует, что вы вставите только на фон там, где исходное изображение непрозрачно, а не там, где оно прозрачно.Так:
from PIL import Image, ImageOps
# Load image
im = Image.open('cross.png')
# Colorize
red = ImageOps.colorize(im.convert('L'), black='black', white='red')
red.save('DEBUG-red.png')
# Make solid white background, same size as cross
bg = Image.new('RGB', size=im.size, color='white')
# Paste
bg.paste(red, mask=im)
Вот немного другой подход с использованием цветового пространства HSV:
from PIL import Image, ImageOps
im = Image.open('cross.png')
brightness = im.convert('L')
# Set Hue angle to 0 degrees, i.e. red
Hue = Image.new('L', size=im.size, color=0)
# Set Saturation to 50%, not too vivid
Sat = Image.new('L', size=im.size, color=128)
coloured = Image.merge('HSV', (Hue, Sat, brightness)).convert('RGB')
coloured.save('DEBUG-coloured.png')
bg = Image.new('RGB', size=im.size, color='white')
bg.paste(coloured, mask =im)
bg.save('result.png')
Или сделайте ненасыщенный синий — измените 128 на 255, чтобы сделать ярким и насыщенным:
from PIL import Image, ImageOps
im = Image.open('cross.png')
brightness = im.convert('L')
# Set Hue angle to 240 degrees scaled to unsigned char range
Hue = Image.new('L', size=im.size, color=int(240*255/360))
# Set Saturation to 50%, not too vivid
Sat = Image.new('L', size=im.size, color=128)
coloured = Image.merge('HSV', (Hue, Sat, brightness)).convert('RGB')
coloured.save('DEBUG-coloured.png')
bg = Image.new('RGB', size=im.size, color='white')
bg.paste(coloured, mask =im)
bg.save('result.png')
Вы хотите сделать крест альфа-маской, затем вы можете изменить цвет, и тень останется, но будет соответствовать цвету креста.