我有一个包含 34,000 张图像的文件夹(所有图像的大小完全相同),我想将它们全部层叠在一起,执行的操作相当于 Photoshop 的“深色”图层混合模式。
我认为操作不起作用,因为这些操作旨在对一批图像执行给定的操作。我需要类似“文件 > 脚本 > 将文件加载到堆栈”的操作。问题是,如果我尝试对整个文件夹执行此操作,Photoshop 就会挂起。
有没有办法将其变成自定义操作?如果可能的话,它可能会有所帮助,因为我可以在每次迭代中展平和合并图层,以避免产生包含 34,000 个图层的笨重文件。
如果有人知道如何使用 Imagemagick 来实现我的目标,我也愿意使用 Imagemagick...
答案1
我可以想象,由于涉及的文件数量太多,您将很难解决 Photoshop 挂起的问题。
但是,既然您表示愿意使用 Imagemagick。
这是一个 Python 脚本,它通过三个步骤完成此任务。
- 划分任务:不要一次性处理所有图像,而是将图像分组。例如,一次处理 100 张图像。
- 混合分块图像:使用 ImageMagick 混合每个块并生成结果图像。
- 混合结果图像:处理完所有块后,将结果图像混合在一起。
import os
import subprocess
IMAGE_FOLDER = '/path/to/images' # Replace with your images path
CHUNK_SIZE = 100
OUTPUT_FOLDER = '/path/to/output' # Replace with your desired output path
images = sorted(os.listdir(IMAGE_FOLDER))
chunk_images = [images[i:i + CHUNK_SIZE] for i in range(0, len(images), CHUNK_SIZE)]
resultant_images = []
for idx, chunk in enumerate(chunk_images):
first_image = chunk[0]
command = f'convert {os.path.join(IMAGE_FOLDER, first_image)}'
for image in chunk[1:]:
command += f' {os.path.join(IMAGE_FOLDER, image)} -compose darken -composite'
output_image = os.path.join(OUTPUT_FOLDER, f'result_{idx}.png')
command += f' {output_image}'
subprocess.call(command, shell=True)
resultant_images.append(output_image)
# Now blend the resultant images together
command = f'convert {resultant_images[0]}'
for image in resultant_images[1:]:
command += f' {image} -compose darken -composite'
final_output_image = os.path.join(OUTPUT_FOLDER, 'final_result.png')
command += f' {final_output_image}'
subprocess.call(command, shell=True)
您将需要安装 ImageMagick 并从终端访问转换命令,并且您需要替换路径以适合您的本地设置。
答案2
好的,受到其他答案的启发,该答案部分有效但存在一些错误,我编写了自己的 Python 实现:
#!/usr/bin/env python3
import os
import subprocess
dir = [path to dir with all of the images]
targetdir = [path to target dir]
mylist = os.listdir(dir)
max = 34867
i = 0
while i <= 34867:
try:
cmd = ['convert', targetdir+'composite'+str(i)+'.png', dir+mylist[i] ,'-compose','darken','-composite',targetdir+'composite'+str(i+1)+'.png']
subprocess.call(cmd, shell=False)
print(i)
os.remove(targetdir+'composite'+str(i)+'.png')
i = i+1
except:
i = i-1
print("hmm "+dir+mylist[i]+" didn't work")
您只需从序列中取出第一个文件,将其命名为“composite0.png”并将其放入目标目录中。然后将其撕开,并观察 stdout 中的数字。时不时出现 Imagemagick 错误,我需要解决这些问题,所以现在只是添加一个例外,直到我能找到这些问题的根源。