gpt4 book ai didi

python - 无法将图像粘贴到带有循环的正方形中

转载 作者:行者123 更新时间:2023-12-01 06:43:34 24 4
gpt4 key购买 nike

我无法以方形形式粘贴图像(如果我为 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 的结果,其中包含图像(应粘贴的顺序):林克、马里奥、塞尔达公主、桃子。

Result

最佳答案

我在您的代码中发现了几个问题:

  • 在方法声明中,您还应该传递每个图像的(所需)宽度和高度。 (实际上,您的方法假设 widthheight 在外部正确设置。)这还有一个优点,即您可以在内部动态调整图像大小你的循环。

  • 您没有注意何时使用n_album以及何时int(math.sqrt(n_album))。 (查看您的 2x2 蒙太奇:您显然初始化了 4x4 蒙太奇。)对于后者,创建一个像 n_per_axis 这样的变量,这样您就没有这个 math.sqrt 术语了时间。

  • 在嵌套循环中,有 i = 1, 2, 3j = 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)

我得到以下输出:

Output

希望有帮助!

关于python - 无法将图像粘贴到带有循环的正方形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59344025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com