Как вы совмещаете изображение с другим изображением с PIL в Python?
Мне нужно взять изображение и поместить его на новый, сгенерированный белый фон, чтобы он мог быть превращен в загружаемые обои для рабочего стола. Таким образом, процесс будет идти:
- Создать новое, все белое изображение с размерами 1440x900.
- Поместите существующее изображение сверху, в центре
- Сохранить как одиночное изображение
В PIL я вижу объект ImageDraw
, но ничто не указывает, что он может нарисовать существующие данные изображения на другое изображение. Предложения или ссылки, которые кто-либо может порекомендовать?
Ответы
Ответ 1
Это может быть выполнено с помощью метода экземпляра изображения paste
:
from PIL import Image
img = Image.open('/pathto/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')
Это и многие другие трюки PIL можно найти в Учебное пособие NADA Alramli PIL
Ответ 2
На основе ответа на 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()
Не забудьте использовать Pillow (Документация, GitHub, PyPI) вместо python-изображений, поскольку Pillow работает с Python 2.X и Python 3.X.
Ответ 3
Image.blend()
? [ссылка]
Или, еще лучше, Image.paste()
, та же ссылка.
Ответ 4
Возможно, слишком поздно, но для таких операций с изображениями мы используем ImageSpecField [ссылка] в модели с оригинальным изображением.
Ответ 5
Это что-то подобное
Где я начал, создавал этот "белый фон" в фотошопе и экспортировал его как 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 # 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()
чтобы показать ваше новое изображение