2010-04-01 88 views
39

Tôi cần chụp ảnh và đặt nó lên nền trắng mới được tạo để nó được chuyển đổi thành hình nền máy tính để bàn có thể tải xuống. Vì vậy, quá trình này sẽ đi:Làm thế nào để bạn tổng hợp một hình ảnh vào một hình ảnh khác với PIL trong Python?

  1. Tạo mới, tất cả các hình ảnh trắng với 1440x900 kích thước
  2. Nơi hình ảnh hiện trên đầu trang, trung
  3. Save as hình ảnh duy nhất

Trong PIL, tôi thấy ImageDraw đối tượng, nhưng không có gì cho biết nó có thể vẽ dữ liệu hình ảnh hiện có lên một hình ảnh khác. Đề xuất hoặc liên kết mà mọi người có thể đề xuất?

Trả lời

73

Điều này có thể được thực hiện với phương pháp paste một thể hiện hình ảnh của:

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

này và nhiều thủ đoạn PIL khác có thể được đón tại Nadia Alramli's PIL Tutorial

+0

Bạn có thể cần phải nhập tùy thuộc vào mô-đun/hệ thống/phiên bản của bạn: từ nhập PIL Hình ảnh –

+1

Cảm ơn @NunoAniceto, tôi đã thay đổi thành 'từ hình ảnh nhập PIL 'để làm cho mã nhiều hơn [tương thích với Gối] (http: //pillow.readthedocs.org/en/latest/porting-pil-to-pillow.html). – unutbu

+0

Nếu bạn đang sử dụng Python 3.x, hãy kiểm tra https://stackoverflow.com/a/17530159/7326714 để sửa lỗi số nguyên lỗi 'offeset'. – LucSpan

0

Image.blend()? [link]

Hoặc, tốt hơn, Image.paste(), cùng một liên kết.

+0

"Tạo ra một hình ảnh mới bằng cách nội suy giữa những hình ảnh nhất định, sử dụng một alpha không đổi. Cả hai hình ảnh phải có cùng kích thước và chế độ. " Từ tài liệu, có vẻ như chúng không thể có kích thước khác nhau. – Sebastian

+0

Tôi cũng chú ý 'Image.paste()', đó là giải pháp cuối cùng. – Felix

0

Có lẽ đã quá muộn, nhưng đối với các hoạt động hình ảnh như vậy, chúng tôi làm sử dụng ImageSpecField [link] trong mô hình với hình ảnh gốc.

5

Dựa trên câu trả lời 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() 

Hãy nhớ sử dụng loại gối (Documentation, GitHub, PyPI) thay vì python-hình ảnh như nhiều loại gối để làm việc với Python 2.x và 3.x. Python

1

này là để làm một cái gì đó tương tự

Nơi tôi bắt đầu là bằng cách tạo ra đó là nền trắng 'trong photoshop và xuất khẩu nó như là một tập tin PNG. Đó là nơi tôi có im1 (Hình 1). Sau đó, sử dụng chức năng dán khiến nó dễ dàng hơn.

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

để hiển thị hình ảnh mới của bạn

Các vấn đề liên quan