2010-04-01 12 views
39

Ich muss ein Bild aufnehmen und auf einen neuen, generierten weißen Hintergrund legen, damit es in ein herunterladbares Desktop-Hintergrundbild konvertiert werden kann. So würde der Prozess gehen:Wie wird ein Bild mit PIL in Python auf ein anderes Bild zusammengesetzt?

  1. neu generieren, die alles Weiß-Bild mit 1440x900 Dimensionen
  2. Platz vorhandenes Bild oben, zentrierte
  3. Speicher als einzelnes Bild

In PIL, sehe ich die ImageDraw Objekt, aber nichts deutet darauf hin, dass es vorhandene Bilddaten auf ein anderes Bild zeichnen kann. Vorschläge oder Links, die jeder empfehlen kann?

Antwort

73

Dies kann mit einem Bild-Instanz paste Verfahren erreicht werden:

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

Dieses und viele andere PIL Tricks bei Nadia Alramli's PIL Tutorial

+0

Sie müssen möglicherweise abhängig von Ihrem Modul/System/Version importieren: von PIL-Import Image –

+1

Danke @NunoAniceto, ich habe es geändert, um 'aus PIL-Import Image', um den Code mehr [kompatibel mit Kissen] (http: //pillow.readthedocs.org/en/latest/porting-pil-to-pillow.html). – unutbu

+0

Wenn Sie Python 3.x verwenden, überprüfen Sie https://StackOverflow.com/a/17530159/7326714, um den "offset" Tupel-Integer-Fehler zu beheben. – LucSpan

0

Image.blend()? [link]

Oder, besser noch, Image.paste(), gleichen Link.

+0

„Erstellt ein neues Bild, das durch zwischen den gegebenen Bildern interpoliert, um eine konstante alpha verwendet wird. Beide Bilder muss die gleiche Größe und den gleichen Modus haben. " Aus der Dokumentation geht hervor, dass sie nicht unterschiedlich groß sein können. – Sebastian

+0

Ich habe 'Image.paste()' auch notiert, was letztendlich die Lösung war. – Felix

0

abgeholt werden kann Vielleicht zu spät, aber für eine solche Bildoperationen, wir tun Verwenden Sie ImageSpecField [link] im Modell mit Originalbild.

5

Basierend auf unutbus Antwort:

#!/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() 

Denken Sie daran, Kissen zu verwenden (Documentation, GitHub, PyPI) anstelle von python-imaging als Kissen arbeitet mit Python 2.x und Python 3.X

1

Dies ist etwas ähnlich

zu tun, wo ich begann, war durch das Erzeugen, dass ‚weißen Hintergrund‘ in Photoshop und sie als PNG-Datei zu exportieren. Dort habe ich im1 (Bild 1). Dann benutzte die Paste-Funktion, weil es viel einfacher ist.

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

Ihr neues Bild zeigen

Verwandte Themen