Tenho uma imagem png transparente "foo.png" e abri outra imagem com
im = Image.open("foo2.png");
agora o que eu preciso é mesclar foo.png com foo2.png.
(foo.png contém algum texto e quero imprimi-lo em foo2.png)
Tenho uma imagem png transparente "foo.png" e abri outra imagem com
im = Image.open("foo2.png");
agora o que eu preciso é mesclar foo.png com foo2.png.
(foo.png contém algum texto e quero imprimi-lo em foo2.png)
;
no final de seus comandos em python: É feio ...Respostas:
O primeiro parâmetro para
.paste()
é a imagem a colar. Segundo são as coordenadas, e o molho secreto é o terceiro parâmetro. Indica uma máscara que será usada para colar a imagem. Se você passar uma imagem com transparência, o canal alfa será usado como máscara.Verifique os documentos .
fonte
foreground.convert('RGBA')
o parâmetro mask.ValueError: bad transparency mask
ValueError: bad transparency mask
usobg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
não funciona como esperado quando a imagem de fundo também contém transparência. Você precisa usar o Alpha Compositing real .Pillow 2.0 contém uma
alpha_composite
função que faz isso.EDIT: As duas imagens precisam ser do tipo RGBA. Portanto, é necessário chamar
convert('RGBA')
se eles estão em paleta, etc. Se o plano de fundo não tiver um canal alfa, você poderá usar o método de colagem regular (que deve ser mais rápido).fonte
ValueError: image has wrong made
também @DenizOzgerComo olt já apontou,
Image.paste
não funciona corretamente quando a origem e o destino contêm alfa.Considere o seguinte cenário:
Duas imagens de teste, ambas contêm alfa:
Composição da imagem usando
Image.paste
o seguinte:produz a seguinte imagem (a parte alfa dos pixels vermelhos sobrepostos é completamente retirada da 2ª camada. Os pixels não são misturados corretamente):
Composição da imagem usando
Image.alpha_composite
o seguinte:produz a seguinte imagem (correta):
fonte
alpha_composite
não é possível definir o deslocamento, você se importaria em dar um exemplo para substituir completamente apaste
função?Pode-se também usar a mistura:
fonte
fonte
Tinha uma pergunta semelhante e tinha dificuldade em encontrar uma resposta. A função a seguir permite colar uma imagem com um parâmetro de transparência sobre outra imagem em um deslocamento específico.
fonte
ValueError: images do not match
Acabei codificando a sugestão desse comentário feito pelo usuário @ P.Melch e sugerido por @Mithril em um projeto em que estou trabalhando.
Também codifiquei fora dos limites de segurança, eis o código para isso . (Vinculei um commit específico porque as coisas podem mudar no futuro deste repositório)
Nota: Espero matrizes numpy das imagens,
np.array(Image.open(...))
como as entradas A e Bcopy_from
e osoverlay
argumentos dessa função vinculada .As dependências são a função logo antes, o
copy_from
método e as matrizes numpy como o conteúdo da imagem PIL para fatiar.Embora o arquivo seja muito orientado a classe, se você quiser usar essa função
overlay_transparent
, renomeieself.frame
para a matriz numpy da imagem de plano de fundo.Ou você pode simplesmente copiar o arquivo inteiro (provavelmente remover algumas importações e a
Utils
classe) e interagir com essa classe Frame da seguinte maneira:Então,
background.frame
como o array composto sobreposto e alfa, você pode obter uma imagem PIL comoverlayed = Image.fromarray(background.frame)
ou algo como:Ou, exatamente
background.save("save path")
como é tirado diretamente do componente interno composto alfaself.frame
variável .Você pode ler o arquivo e encontrar algumas outras funções agradáveis com esta implementação eu codificado como a métodos
get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)Você provavelmente desejaria remover o
resolve_pending
método específico para esse projeto.Que bom que eu ajudei você, não deixe de conferir o repo do projeto que estou falando, essa pergunta e discussão me ajudaram muito no desenvolvimento :)
fonte