2010-04-01 9 views
39

Ho bisogno di prendere un'immagine e posizionarla su un nuovo sfondo bianco generato in modo che possa essere convertita in uno sfondo desktop scaricabile. Così il processo sarebbe andato:Come si compone un'immagine su un'altra immagine con PIL in Python?

  1. generare nuovi, tutti image bianco con 1440x900 dimensioni
  2. immagine Posto esistente sulla parte superiore, centrato
  3. Salva come singola immagine

In PIL, vedo il ImageDraw oggetto, ma nulla indica che può disegnare i dati dell'immagine esistente su un'altra immagine. Suggerimenti o collegamenti che chiunque può consigliare?

risposta

73

Questo può essere realizzato con paste il metodo di un'istanza 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') 

Questo e molti altri trucchi pil può essere ritirato presso Nadia Alramli's PIL Tutorial

+0

Potrebbe essere necessario importare in base al modulo/sistema/versione: dall'importazione del PIL Immagine –

+1

Grazie a @NunoAniceto, l'ho modificato in 'from PIL import Image' per rendere il codice più [compatibile con Pillow] (http: //pillow.readthedocs.org/en/latest/porting-pil-to-pillow.html). – unutbu

+0

Se si utilizza Python 3.x, selezionare https://stackoverflow.com/a/17530159/7326714 per correggere l'errore di tuple integer "offeset". – LucSpan

0

Image.blend()? [link]

O, meglio ancora, Image.paste(), stesso collegamento.

+0

"crea una nuova immagine interpolando tra le immagini indicate, utilizzando un'alpha costante. Entrambe le immagini deve avere la stessa dimensione e modalità. " Dalla documentazione, sembra che non possano essere di dimensioni diverse. – Sebastian

+0

Ho notato anche 'Image.paste()', che in definitiva era la soluzione. – Felix

0

Forse troppo tardi, ma per le operazioni di tale immagine, che facciamo utilizzare ImageSpecField [link] nel modello con l'immagine originale.

5

in base alla risposta 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() 

Ricordate di usare Cuscino (Documentation, GitHub, PyPI) invece di python-imaging come cuscino lavora con Python 2.xe Python 3.X.

1

Questo è quello di fare qualcosa di simile

Dove ho iniziato era generando che 'sfondo bianco' in photoshop e l'esportazione come file PNG. Ecco dove ho preso im1 (Immagine 1). Quindi ha usato la funzione Incolla perché è molto più semplice.

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() 

per mostrare la vostra nuova immagine

Problemi correlati