Как перекрыть два или более изображения с помощью paste ()? - PullRequest
1 голос
/ 05 февраля 2020

Я работаю над небольшим GUI для программы, написанной на Python, которая берет сумму для оплаты, данную сумму и возвращает изменение в форме изображений банкнот и монет. Из-за того, как работает tkinter, я пытаюсь оптимизировать пространство, перекрывающее изображения заметок, но не могу найти способ сделать так, чтобы вторые изображения не обрезались. Вот код, который я пытаюсь:

import tkinter as tk
from PIL import Image, ImageTk

window = tk.Tk()
window.title('main')
window.geometry('300x200')
test_image_1 = Image.open("fifty_pound.jpg")
test_image_1 = test_image_1.resize((250, 150), Image.ANTIALIAS)
test_image_2 = Image.open("twenty_pound.jpg")
test_image_2 = test_image_2.resize((250, 150), Image.ANTIALIAS)

Image.Image.paste(test_image_1, test_image_2, (50, 0))

test_image_1_render = ImageTk.PhotoImage(test_image_1)
test_image_label = tk.Label(image=test_image_1_render)
test_image_label.image = test_image_1_render
test_image_label.pack()

window.mainloop()

Результат, который я получаю, таков:

Image returned

Как вы можно увидеть 20 фунтов стерлингов Мои вопросы:

1) Можно ли вставить изображение банкноты 20 фунтов, перекрывающее изображение 50 фунтов, без обрезки?

2) Как можно перекрыть более двух фотографий в одном Кстати?

Большое спасибо всем за помощь.

Здесь используются два изображения: fifty_pound twenty_pound

1 Ответ

1 голос
/ 05 февраля 2020

Я в основном следую советам, данным вам в комментариях, но так как я уже готовил некоторый код, это было бы моим решением:

import tkinter as tk
from PIL import Image, ImageTk

# List of images (notes) to show
notes = ['fifty_pound.jpg', 'twenty_pound.jpg', 'twenty_pound.jpg']

# Same size for each note
x_note, y_note = (250, 150)

# Load images
notes = [Image.open(n).resize((x_note, y_note), Image.ANTIALIAS) for n in notes]

# Number of notes to show
n_notes = len(notes)

# Overlap (or offset) between notes
x_off, y_off = (50, 30)

# Calculate window size
window_size = (x_note + (n_notes - 1) * x_off, y_note + (n_notes - 1) * y_off)

# Create window
window = tk.Tk()
window.title('main')

# Create blank (white) image to paste notes on
new_image = Image.new('RGB', (window_size), (255, 255, 255))

# Paste notes
for i, n in enumerate(notes):
    Image.Image.paste(new_image, n, (i*x_off, i*y_off))

# Rendering
new_image_render = ImageTk.PhotoImage(new_image)
test_image_label = tk.Label(image=new_image_render)
test_image_label.image = new_image_render
test_image_label.pack()

window.mainloop()

Вывод:

Output

Надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
Pillow:      7.0.0
----------------------------------------
...