¿Cómo se compone una imagen en otra imagen con PIL en Python?

Necesito tomar una imagen y colocarla en un nuevo fondo blanco generado para que se convierta en un fondo de escritorio descargable. Entonces el proceso iría:

  1. Genere una imagen nueva en blanco con dimensiones de 1440×900.
  2. Coloque la imagen existente en la parte superior, centrada
  3. Guardar como una sola imagen

En PIL, veo el objeto ImageDraw , pero nada indica que pueda dibujar datos de imagen existentes en otra imagen. ¿Sugerencias o enlaces que alguien pueda recomendar?

Esto se puede lograr con el método de paste una instancia de Image:

 from PIL import Image img = Image.open('/path/to/file', 'r') img_w, img_h = img.size background = Image.new('RGBA', (1440, 900), (255, 255, 255, 255)) bg_w, bg_h = background.size offset = ((bg_w - img_w) // 2, (bg_h - img_h) // 2) background.paste(img, offset) background.save('out.png') 

Este y muchos otros trucos de PIL se pueden encontrar en el tutorial de PIL de Nadia Alramli.

Basado en la respuesta de unutbus:

 #!/usr/bin/env python from PIL import Image import math def resize_canvas(old_image_path="314.jpg", new_image_path="save.jpg", canvas_width=500, canvas_height=500): """ Place one image on another image. Resize the canvas of old_image_path and store the new image in new_image_path. Center the image on the new canvas. """ im = Image.open(old_image_path) old_width, old_height = im.size # Center the image x1 = int(math.floor((canvas_width - old_width) / 2)) y1 = int(math.floor((canvas_height - old_height) / 2)) mode = im.mode if len(mode) == 1: # L, 1 new_background = (255) if len(mode) == 3: # RGB new_background = (255, 255, 255) if len(mode) == 4: # RGBA, CMYK new_background = (255, 255, 255, 255) newImage = Image.new(mode, (canvas_width, canvas_height), new_background) newImage.paste(im, (x1, y1, x1 + old_width, y1 + old_height)) newImage.save(new_image_path) resize_canvas() 

Recuerde utilizar Pillow ( Documentation , GitHub , PyPI ) en lugar de Python-imaging, ya que Pillow funciona con Python 2.X y Python 3.X.

Esto es para hacer algo similar.

Donde comencé fue generando ese ‘fondo blanco’ en photoshop y exportándolo como un archivo PNG. Ahí es donde conseguí im1 (Imagen 1). Luego usó la función de pegar porque es mucho más fácil.

 from PIL import Image im1 = Image.open('image/path/1.png') im2 = Image.open('image/path/2.png') area = (40, 1345, 551, 1625) im1.paste(im2, area) l>(511+40) l>(280+1345) | l> From 0 (move, 1345px down) -> From 0 (top left, move 40 pixels right) 

Okay so where did these #'s come from? (40, 1345, 551, 1625) im2.size (511, 280) Because I added 40 right and 1345 down (40, 1345, 511, 280) I must add them to the original image size which = (40, 1345, 551, 1625)

 im1.show() 

para mostrar tu nueva imagen

Image.blend() ? [ enlace ]

O, mejor aún, Image.paste() , mismo enlace.

Quizás demasiado tarde, pero para tales operaciones de imagen, usamos ImageSpecField [ link ] en el modelo con la imagen original.