Tengo un JPEG:
Quiero insertar el PNG:
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:
Pero cuando ahora llamo:
vips insert tile.png pin.png newimage.png 128 128
Obtengo lo siguiente:
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:
insert
admite el fondo transparente?LG
codecitizen
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:
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!
Comentario más útil
Puede ampliar la superposición para que coincida con la imagen grande y luego componer:
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.