温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - How to overlap two or more images using paste()?
python python-imaging-library tkinter

python - 如何使用paste()重叠两个或更多图像?

发布于 2020-04-20 15:00:25

我正在为一个用Python编写的程序制作一个小GUI,该程序需要支付一定的费用,给定的金额并以纸币和硬币的图像形式返回更改。由于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()

我得到的结果是这样的:

图片返回

如您所见,这20磅钞票被切掉了。我的问题是:

1)是否可以将20磅笔记图片与50磅笔记图片粘贴在一起而不会被剪切?

2)如何以相同方式重叠两张以上的图片?

非常感谢大家的帮助。

这里使用了两个图像: 五十磅 二十磅

查看更多

提问者
Py_Rog
被浏览
6
HansHirse 2020-02-05 19:45

我基本上遵循评论中给您的建议-但由于我已经在准备一些代码,因此这将是我的解决方案:

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

输出:

输出量

希望有帮助!

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