Как Вы составляете изображение на другое изображение с PIL в Python?

Я должен взять изображение и поместить его на новое, генерировал белый фон для него, чтобы быть преобразованным в загружаемые обои для рабочего стола. Таким образом, процесс пошел бы:

  1. Генерируйте новый, все белое изображение с 1440x900 размеры
  2. Поместите существующее изображение в вершину, центрируемую
  3. Сохраните как единственное изображение

В PIL я вижу ImageDraw объект, но ничто не указывает, что он может потянуть существующие данные изображения на другое изображение. Предложения или ссылки кто-либо может рекомендовать?

62
задан 11 March 2013 в 18:07

3 ответа

Это должно сделать что-то подобное

, Где я запустил, был путем генерации того 'белого фона' в фотошопе и экспорта его как файла PNG. Это - то, где я получил im1 (Изображение 1). Затем используемый вставка функционирует причина, это - легче путь.

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

для показа нового изображения

2
ответ дан 31 October 2019 в 13:53

На основе ответа 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()

Не забывают использовать Подушку ( Документация , GitHub, PyPI) вместо обработки изображений Python, поскольку Подушка работает с Python 2. X и Python 3. X

7
ответ дан 31 October 2019 в 13:53

Возможно, слишком поздно, но для таких операций изображения, мы действительно используем ImageSpecField [ ссылка ] в модели с исходным изображением.

0
ответ дан 31 October 2019 в 13:53

Другие вопросы по тегам:

Похожие вопросы: