Tengo una imagen png transparente "foo.png" y he abierto otra imagen con
im = Image.open("foo2.png");
ahora lo que necesito es fusionar foo.png con foo2.png.
(foo.png contiene texto y quiero imprimir ese texto en foo2.png)
Tengo una imagen png transparente "foo.png" y he abierto otra imagen con
im = Image.open("foo2.png");
ahora lo que necesito es fusionar foo.png con foo2.png.
(foo.png contiene texto y quiero imprimir ese texto en foo2.png)
;
al final de sus comandos en Python: Es feo ...Respuestas:
El primer parámetro para
.paste()
es la imagen para pegar. En segundo lugar están las coordenadas, y la salsa secreta es el tercer parámetro. Indica una máscara que se utilizará para pegar la imagen. Si pasa una imagen con transparencia, el canal alfa se usa como máscara.Revisa los documentos .
fuente
foreground.convert('RGBA')
el parámetro de máscara.ValueError: bad transparency mask
ValueError: bad transparency mask
usobg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
no funciona como se esperaba cuando la imagen de fondo también contiene transparencias. Necesita usar Alpha Compositing real .Pillow 2.0 contiene una
alpha_composite
función que hace esto.EDITAR: Ambas imágenes deben ser del tipo RGBA. Por lo tanto, debe llamar
convert('RGBA')
si están paletizados, etc. Si el fondo no tiene un canal alfa, puede usar el método de pegado regular (que debería ser más rápido).fuente
ValueError: image has wrong made
@DenizOzgerComo OLT ya se ha señalado,
Image.paste
no funciona correctamente, cuando la fuente y el destino de ambos contienen alfa.Considere el siguiente escenario:
Dos imágenes de prueba, ambas contienen alfa:
Composición de imagen usando
Image.paste
así:produce la siguiente imagen (la parte alfa de los píxeles rojos superpuestos se toma completamente de la segunda capa. Los píxeles no se mezclan correctamente):
Composición de imagen usando
Image.alpha_composite
así:produce la siguiente imagen (correcta):
fuente
alpha_composite
no puede establecer el desplazamiento, ¿le importaría dar un ejemplo para reemplazar completamente lapaste
función?También se puede usar la mezcla:
fuente
fuente
Tenía una pregunta similar y tuvo dificultades para encontrar una respuesta. La siguiente función le permite pegar una imagen con un parámetro de transparencia sobre otra imagen en un desplazamiento específico.
fuente
ValueError: images do not match
Terminé codificando la sugerencia de este comentario hecha por el usuario @ P.Melch y sugerida por @Mithril en un proyecto en el que estoy trabajando.
También codifiqué la seguridad fuera de los límites, aquí está el código para ello . (Enlace un commit específico porque las cosas pueden cambiar en el futuro de este repositorio)
Nota: Espero matrices numpy de las imágenes, así
np.array(Image.open(...))
como las entradas A y Bcopy_from
y losoverlay
argumentos de esta función vinculada .Las dependencias son la función justo antes, el
copy_from
método y las matrices numpy como contenido de imagen PIL para segmentar.Aunque el archivo está muy orientado a la clase, si desea utilizar esa función
overlay_transparent
, asegúrese de cambiar el nombre de laself.frame
matriz numpy de la imagen de fondo.O simplemente puede copiar todo el archivo (probablemente eliminar algunas importaciones y la
Utils
clase) e interactuar con esta clase de marco de la siguiente manera:Luego tiene su
background.frame
matriz compuesta superpuesta y alfa, puede obtener una imagen PIL de ella conoverlayed = Image.fromarray(background.frame)
o algo así como:O simplemente
background.save("save path")
como eso toma directamente de laself.frame
variable interna compuesta alfa .Usted puede leer el archivo y encontrar algunas otras funciones interesantes con esta aplicación que codificado como el métodos
get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)Probablemente desee eliminar el
resolve_pending
método, ya que es específico para ese proyecto.Me alegro de haberte ayudado, asegúrate de revisar el repositorio del proyecto del que estoy hablando, esta pregunta y este hilo me ayudaron mucho en el desarrollo :)
fuente