Libvips: Inserir PNG com fundo transparente em JPEG - Obtendo fundo branco

Criado em 25 out. 2017  ·  4Comentários  ·  Fonte: libvips/libvips

Eu tenho um JPEG:

tile

Quero inserir o PNG:

pin

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:
tile

Mas quando eu ligo agora:

vips insert tile.png pin.png newimage.png 128 128

Eu obtenho o seguinte:
inserted

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:

  • O comando libvips insert suporta fundo transparente?
  • Se sim: alguém pode me indicar como usar esse recurso?
  • ... ou talvez eu esteja fazendo algo errado aqui?

LG
codecidadão

question

Comentários muito úteis

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.

Todos 4 comentários

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:

final

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!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

revathi-murali picture revathi-murali  ·  3Comentários

Kyle-Kyle picture Kyle-Kyle  ·  4Comentários

Boojs picture Boojs  ·  5Comentários

BorntraegerMarc picture BorntraegerMarc  ·  3Comentários

AKlein920 picture AKlein920  ·  3Comentários