gpt4 book ai didi

python - 用Python创建图片蒙太奇

转载 作者:行者123 更新时间:2023-12-02 05:11:41 25 4
gpt4 key购买 nike

我没有使用 python 的经验,但该脚本的所有者没有响应。

当我将照片拖到此脚本上以创建蒙太奇时,它最终会在右侧边缘切掉最后一张照片的一半。

4张图片宽,

1   2   3   4

5 6 7 8

图 4 和 8 通常会减半。那里有图片的空间(虽然是空白的)

我想知道是什么原因造成的。

我认为它可能被裁剪,但它几乎就像图片的一半没有导入或检测到。

好吧,您将选定的照片拖到脚本上,它会输出类似这样的内容 http://i.imgur.com/PzNylbV.png

因此,您可以拍摄一堆照片或屏幕截图,并将它们合并到一个文件中,而不是单独添加每张照片。

每张照片的尺寸最大约为 500x250。

enter image description here

编辑:这是预览的上传,您可以看到图像有插槽,但如果这是有意义的,它们就会“消失”。

编辑2:这个脚本曾经工作过一次,我没有编辑过它或任何东西。它已经制作了约 70 个屏幕截图蒙太奇。没有错误或任何东西。我的计算机是否会执行某些操作来中断图像的导入?

#!/usr/bin/env python
import os
import sys
from time import strftime
import Image
import ImageDraw
import ImageFont

# parameters
row_size = 4
margin = 3

def generate_montage(filenames):
images = [Image.open(filename) for filename in filenames]

width = 0
height = 0
i = 0
sum_x = max_y = 0
width = max(image.size[1]+margin for image in images)*row_size
height = sum(image.size[0]+margin for image in images)

montage = Image.new(mode='RGBA', size=(width, height), color=(0,0,0,0))
try:
image_font = ImageFont.truetype('font/Helvetica.ttf', 18)
except:
try:
image_font = ImageFont.load('font/Helvetica-18.pil')
except:
image_font = ImageFont.load_default()
draw = ImageDraw.Draw(montage)
offset_x = offset_y = 0

i = 0
max_y = 0
max_x = 0
offset_x = 0
for image in images:
montage.paste(image, (offset_x, offset_y))

text_coords = offset_x + image.size[0] - 45, offset_y + 120
draw.text(text_coords, '#{0}'.format(i+1), font=image_font)

max_x = max(max_x, offset_x+image.size[0])
if i % row_size == row_size-1:
offset_y += max_y+margin
max_y = 0
offset_x = 0
else:
offset_x += image.size[0]+margin
max_y = max(max_y, image.size[1])

i += 1

if i % row_size:
offset_y += max_y

filename = strftime("Montage %Y-%m-%d at %H.%M.%S.png")
montage = montage.crop((0, 0, max_x, offset_y))
montage.save(filename)

if __name__ == '__main__':
old_cwd = os.getcwd()

os.chdir(os.path.dirname(sys.argv[0]))
try:
if len(sys.argv) > 1:
generate_montage(sys.argv[1:])
finally:
os.chdir(old_cwd)

最佳答案

在尺寸计算中,您使用image.size[1]作为宽度,但这就是高度!使用 image.size[0] 作为宽度,使用 image.size[1] 作为高度。

此外,还有一些小的风格注释:

  • 您真的需要脚本始终从程序目录运行吗?在任何情况下,os.chdir(os.path.dirname(sys.argv[0]))都会阻止程序作为./montage.py执行,因此您可能想使用abspath允许从当前目录调用。
  • 您可以将 for 循环更改为

    ,而不必更新计数器 i
    for i,image in enumerate(images):
  • 以下行无效,因为变量被覆盖/从未使用:

    width = 0
    height = 0
    i = 0
    sum_x = max_y = 0

总而言之,代码可能如下所示:

#!/usr/bin/env python
import os.path
import sys
from time import strftime
import Image

row_size = 4
margin = 3

def generate_montage(filenames, output_fn):
images = [Image.open(filename) for filename in filenames]

width = max(image.size[0] + margin for image in images)*row_size
height = sum(image.size[1] + margin for image in images)
montage = Image.new(mode='RGBA', size=(width, height), color=(0,0,0,0))

max_x = 0
max_y = 0
offset_x = 0
offset_y = 0
for i,image in enumerate(images):
montage.paste(image, (offset_x, offset_y))

max_x = max(max_x, offset_x + image.size[0])
max_y = max(max_y, offset_y + image.size[1])

if i % row_size == row_size-1:
offset_y = max_y + margin
offset_x = 0
else:
offset_x += margin + image.size[0]

montage = montage.crop((0, 0, max_x, max_y))
montage.save(output_fn)

if __name__ == '__main__':
basename = strftime("Montage %Y-%m-%d at %H.%M.%S.png")
exedir = os.path.dirname(os.path.abspath(sys.argv[0]))
filename = os.path.join(exedir, basename)
generate_montage(sys.argv[1:], filename)

关于python - 用Python创建图片蒙太奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555345/

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