Eu tenho um JPEG:
Quero inserir o PNG:
Na posição 128x128 no JPEG.
Ao fazer
vips insert tile.jpg pin.png newimage.jpg 128 128
Isso me dá Error Output: insert: images must have the same number of bands, or one must be single-band
já que pin.jpg tem um canal alfa e tile.jpg não.
Então, eu converto o jpg em png:
convert tile.jpg png32:tile.png
Agora eu tenho um tile.png com Alpha Channel:
Mas quando eu ligo agora:
vips insert tile.png pin.png newimage.png 128 128
Eu obtenho o seguinte:
O fundo do pin.png inserido é branco.
Eu verifiquei vips insert --help-all
mas realmente não encontrei um parâmetro de linha de comando útil. Ambas as imagens possuem um canal alfa. Minhas perguntas:
insert
suporta fundo transparente?LG
codecidadão
Olá @codecitizen ,
insert
é uma operação de nível muito baixo: ela apenas coloca uma imagem em cima da outra, não faz nenhuma mesclagem.
Na libvips atual, você precisa usar ifthenelse
com a opção blend
. É horrível:
# get the alpha channel from the overlay
vips extract_band marker.png alpha.png 3 --n 1
# get RGB from the overlay
vips extract_band marker.png rgb.png 0 --n 3
# find the size of the overlay
width=$(vipsheader -f width marker.png)
height=$(vipsheader -f height marker.png)
# cut out an area the size of marker from the background
vips extract_area background.jpg bg.png 128 128 $width $height
# blend the marker on top of the chunk of background
vips ifthenelse alpha.png rgb.png bg.png blended.png --blend
# insert the blended image back into the background
vips insert background.jpg blended.png final.jpg 128 128
Para gerar isso:
A libvips 8.6 tem um novo operador composite
que pode fazer todos os modos de mesclagem usuais. Você pode fazer:
vips composite "background.jpg marker.png" final.jpg 2
2
significa over
modo de mistura. Suporta todos os modos de mesclagem de PDF. Deve ser lançado em uma semana ou assim.
@jcupitt Ei, obrigado. Instalei o libvips 8.6 e vips composite
funcionou muito bem. Só não tenho certeza de como especificar a localização da segunda imagem, se possível.
Você pode ampliar a sobreposição para corresponder à imagem grande e, em seguida, compor:
width=$(vipsheader -f width background.jpg)
height=$(vipsheader -f height background.jpg)
vips embed marker.png overlay.png 128 128 $width $height
vips composite "background.jpg overlay.png" final.jpg 2
Ou recorte parte do fundo, componha e insira de volta (como acima).
Parece uma coisa comum de se querer fazer, talvez devesse haver uma opção para especificar a posição.
Impressionante! Muito obrigado pela ajuda rápida!
Comentários muito úteis
Você pode ampliar a sobreposição para corresponder à imagem grande e, em seguida, compor:
Ou recorte parte do fundo, componha e insira de volta (como acima).
Parece uma coisa comum de se querer fazer, talvez devesse haver uma opção para especificar a posição.