У меня есть прозрачное изображение png "foo.png", и я открыл другое изображение с
im = Image.open("foo2.png");
Теперь мне нужно объединить foo.png с foo2.png.
(foo.png содержит некоторый текст, и я хочу напечатать этот текст на foo2.png)
У меня есть прозрачное изображение png "foo.png", и я открыл другое изображение с
im = Image.open("foo2.png");
Теперь мне нужно объединить foo.png с foo2.png.
(foo.png содержит некоторый текст, и я хочу напечатать этот текст на foo2.png)
Ответы:
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
Первый параметр .paste()
- это изображение для вставки. Вторые - это координаты, а секретный соус - третий параметр. Указывает маску, которая будет использоваться для вставки изображения. Если вы передаете изображение с прозрачностью, то альфа-канал используется в качестве маски.
Проверьте документы .
foreground.convert('RGBA')
параметр маски.
ValueError: bad transparency mask
ValueError: bad transparency mask
использованиеbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
не работает должным образом, когда фоновое изображение также содержит прозрачность. Вам нужно использовать настоящий альфа-композитинг .
Подушка 2.0 содержит alpha_composite
функцию, которая делает это.
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
РЕДАКТИРОВАТЬ: оба изображения должны быть типа RGBA. Поэтому вам нужно вызывать их, convert('RGBA')
если они имеют палитру и т. Д. Если фон не имеет альфа-канала, вы можете использовать обычный метод вставки (который должен быть быстрее).
ValueError: image has wrong made
, а @DenizOzger
Как уже указывало olt , Image.paste
не работает должным образом, когда источник и пункт назначения содержат альфа.
Рассмотрим следующий сценарий:
Два тестовых изображения, оба содержат альфа:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Компоновка изображения осуществляется Image.paste
так:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
создает следующее изображение (альфа-часть наложенных красных пикселей полностью взята со 2-го слоя. Пиксели не смешаны правильно):
Компоновка изображения осуществляется Image.alpha_composite
так:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
производит следующее (правильное) изображение:
alpha_composite
не можете установить смещение, не могли бы вы привести пример полной замены paste
функции?
Можно также использовать смешивание:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img
У меня был похожий вопрос, и он не мог найти ответ. Следующая функция позволяет вставить изображение с параметром прозрачности поверх другого изображения с определенным смещением.
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
ValueError: images do not match
Я закончил тем, что кодировал себя предложение этого комментария сделанным пользователем @ P.Melch и предложенным @Mithril для проекта, над которым я работаю.
Я также написал код безопасности, вот код для него . (Я связал конкретный коммит, потому что в будущем этот репозиторий может измениться)
Примечание. Я ожидаю, что на изображениях будут использоваться массивы, такие np.array(Image.open(...))
как входы A и B copy_from
и эта связанная функцияoverlay
аргументы .
Зависимости - это функция непосредственно перед ней, copy_from
метод и массивы numpy в качестве содержимого изображения PIL для нарезки.
Хотя файл ориентирован на классы, если вы хотите использовать эту функцию overlay_transparent
, не забудьте переименовать self.frame
массив в фоновый рисунок.
Или вы можете просто скопировать весь файл (возможно, удалить некоторые импорта и Utils
класс) и взаимодействовать с этим классом Frame следующим образом:
# Assuming you named the file frame.py in the same directory
from frame import Frame
background = Frame()
overlay = Frame()
background.load_from_path("your path here")
overlay.load_from_path("your path here")
background.overlay_transparent(overlay.frame, x=300, y=200)
Затем у вас есть background.frame
наложенный и альфа-составной массив, вы можете получить из него изображение PIL с помощью overlayed = Image.fromarray(background.frame)
или что-то вроде:
overlayed = Frame()
overlayed.load_from_array(background.frame)
Или так же, background.save("save path")
как это берет непосредственно из внутренней альфа-композицииself.frame
переменной .
Вы можете прочитать файл и найти какие - то другие функции хорошо с этой реализацией I закодированной как и методы get_rgb_frame_array
, resize_by_ratio
, resize_to_resolution
, rotate
, gaussian_blur
, transparency
, vignetting
:)
Возможно, вы захотите удалить resolve_pending
метод, так как он специфичен для этого проекта.
Рад, что я помог вам, обязательно ознакомьтесь с репозиторием проекта, о котором я говорю, этот вопрос и тема очень помогли мне в разработке :)
;
в конце своих команд в python: это уродливо ...