Libvips: Insertar PNG con fondo transparente en JPEG - Obtención de fondo blanco

Creado en 25 oct. 2017  ·  4Comentarios  ·  Fuente: libvips/libvips

Tengo un JPEG:

tile

Quiero insertar el PNG:

pin

En Posición 128x128 en el JPEG.

Al hacer

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

Me da Error Output: insert: images must have the same number of bands, or one must be single-band ya que pin.jpg tiene un canal alfa y tile.jpg no.

Así que convierto el jpg a png:

convert tile.jpg png32:tile.png    

Ahora tengo un tile.png con Alpha Channel:
tile

Pero cuando ahora llamo:

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

Obtengo lo siguiente:
inserted

El fondo del pin.png insertado es blanco.

Revisé vips insert --help-all pero realmente no encontré un parámetro de línea de comando útil. Ambas imágenes tienen un canal alfa. Mis preguntas:

  • ¿El comando libvips insert admite el fondo transparente?
  • En caso afirmativo: ¿Puede alguien indicarme cómo utilizar esta función?
  • ... o tal vez estoy haciendo algo mal aquí?

LG
codecitizen

question

Comentario más útil

Puede ampliar la superposición para que coincida con la imagen grande y luego componer:

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

O recorte parte del fondo, componga y luego vuelva a insertar (como se muestra arriba).

Esto parece ser algo común que se quiera hacer, tal vez debería haber una opción para especificar la posición.

Todos 4 comentarios

Hola @codecitizen ,

insert es una operación de muy bajo nivel: simplemente coloca una imagen encima de otra, no hace ninguna mezcla.

En los libvips actuales, debe usar ifthenelse con la opción blend . Es bastante horrible:

# 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 generar esto:

final

libvips 8.6 tiene un nuevo y elegante operador composite que puede hacer todos los modos de fusión habituales. Tu puedes hacer:

vips composite "background.jpg marker.png" final.jpg 2

2 significa over modo de mezcla. Es compatible con todos los modos de combinación de PDF. Debería estar disponible en una semana más o menos.

@jcupitt Hola, gracias. Instalé libvips 8.6 y vips composite funcionó muy bien. No estoy seguro de cómo especificar la ubicación de la segunda imagen, si es posible.

Puede ampliar la superposición para que coincida con la imagen grande y luego componer:

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

O recorte parte del fondo, componga y luego vuelva a insertar (como se muestra arriba).

Esto parece ser algo común que se quiera hacer, tal vez debería haber una opción para especificar la posición.

¡Impresionante! ¡Muchas gracias por la ayuda rápida!

¿Fue útil esta página
0 / 5 - 0 calificaciones