Respuestas:
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
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 .
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.
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
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).
ValueError: image has wrong made
@DenizOzger
Como 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:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Composición de imagen usando Image.paste
así:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
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í:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
produce la siguiente imagen (correcta):
alpha_composite
no puede establecer el desplazamiento, ¿le importaría dar un ejemplo para reemplazar completamente la paste
función?
También se puede usar la mezcla:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img
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.
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
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 B copy_from
y los overlay
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 la self.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:
# Assuming you named the file frame.py in the same directory
from frame import Frame
background = Frame()
overlay = Frame()
background.load_from_path("your path here")
overlay.load_from_path("your path here")
background.overlay_transparent(overlay.frame, x=300, y=200)
Luego tiene su background.frame
matriz compuesta superpuesta y alfa, puede obtener una imagen PIL de ella con overlayed = Image.fromarray(background.frame)
o algo así como:
overlayed = Frame()
overlayed.load_from_array(background.frame)
O simplemente background.save("save path")
como eso toma directamente de la self.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 :)
;
al final de sus comandos en Python: Es feo ...