我无法实现以正方形形式粘贴图像(如果我为n_album
选择9,则应该有3x3的拼贴画)。它仅适用于1x1,如果更多,它将在同一张图片上粘贴同一张图片。
这是我的代码:
def make_montage(n_album, path):
x_offset = width #Constant resized image width
y_offset = height #Constant resized image height
c = []
x = 0
img = Image.new('RGB', (n_album*height + y_offset*2, n_album*width + x_offset*2), color = (0, 0, 0))
for file_name in os.listdir(path):
print(f"Processing {file_name}")
c.append(file_name)
print(f"root of n_album = {int(math.sqrt(n_album))}")
#Loop in square
for i in range(int(math.sqrt(n_album))):
for j in range(int(math.sqrt(n_album))):
try:
cover = Image.open(os.path.join(path, c[i + j]))
print(f"Pasting {str(c[i + j])}")
img.paste(cover, (int(i * height + y_offset), int(j * width + x_offset)))
except:
print("Je code mal mdr")
img.save(f'{path}\\{n_album}x{n_album}_musical.png')
#Clean
for file_name in os.listdir(path):
if file_name != f'{n_album}x{n_album}_musical.png':
print(f"Deleting {file_name}")
os.remove(os.path.join(path, file_name))
这是一个2x2的结果,其中包含(应该粘贴的顺序)图像:链接,马里奥,塞尔达公主,桃子。
答案 0 :(得分:1)
我在您的代码中看到了几个问题:
在方法声明中,您还应该传递(期望的)每个图像的宽度和高度。 (按原样,您的方法假设width
和height
在外部正确设置。)这还有一个优点,您可以在循环中即时调整图像大小。
您无需关注何时使用n_album
和何时使用int(math.sqrt(n_album))
。 (请参见2x2蒙太奇:您显然已初始化了4x4蒙太奇。)对于后者,请创建一个n_per_axis
之类的变量,这样就不必一直使用math.sqrt
这个术语。
在嵌套循环中,您有i = 1, 2, 3
和j = 1, 2, 3
。这样,使用c[i + j]
并不是从c
访问正确图像的正确方法。 (在您的2x2蒙太奇中,您得到(0 + 1)= 1和(1 + 0)= 1,因此两次Mario。)设置一个(全局)图像计数器(假设k
)并递增每次进入内循环时都会显示它。
如果不是您要问的重点,请不要发布包括删除文件在内的代码。
这是经过一些修改的代码:
def make_montage(n_album, path, width, height): # <-- Width, height!?
x_offset = width
y_offset = height
c = []
n_per_axis = int(math.sqrt(n_album))
img = Image.new('RGB',
(n_per_axis*height + y_offset*2, # <-- n per axis!?
n_per_axis*width + x_offset*2), # <-- n per axis!?
color=(0, 0, 0))
for file_name in os.listdir(path):
print(f"Processing {file_name}")
c.append(file_name)
print(f"root of n_album = {n_per_axis}")
# Loop in square
k = -1 # <-- Image counter
for i in range(n_per_axis):
for j in range(n_per_axis):
k += 1
try:
cover = Image.open(os.path.join(path, c[k]))\
.resize((width, height)) # <-- Might be omitted here
print(f"Pasting {str(c[k])}")
img.paste(cover,
(int(i * height + y_offset),
int(j * width + x_offset)))
except:
print("Je code mal mdr")
img.save(f'{path}\\{n_per_axis}x{n_per_axis}_musical.png') # <-- n per axis!?
for file_name in os.listdir(path):
if file_name != f'{n_per_axis}x{n_per_axis}_musical.png':
print(f"Deleting {file_name}")
#os.remove(os.path.join(path, file_name))
使用
make_montage(9, 'path_with_nine_images/', 100, 100)
我得到以下输出:
希望有帮助!