用Python创建图片蒙太奇

2023-12-30

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

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

4张图片宽,

1   2   3   4

5   6   7   8

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

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

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

Well, you drag selected photos over the script , it outputs something like this http://i.imgur.com/PzNylbV.png

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

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

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

编辑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 http://docs.python.org/dev/library/os.path.html#os.path.abspath允许从当前目录调用。
  • 而不必更新计数器i,您可以将 for 循环更改为

    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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Python创建图片蒙太奇 的相关文章

随机推荐

  • Make 中的默认规则

    make 中是否有一种机制允许在任何地方使用默认的全局隐式规则 类似于内置规则 Make 提供了一些用于编译 C C Fortran 文件的内置隐式规则 甚至不需要Makefile对于简单的情况 然而 当编译其他语言 例如Go编程语言文件
  • 如何使用spaCy进行文本预处理?

    如何使用 python 在 spaCy 中执行预处理步骤 例如停用词删除 标点符号删除 词干提取和词形还原 我在 csv 文件中有文本数据 如段落和句子 我想做文本清理 请举例说明在 pandas 数据框中加载 csv 这可能有帮助 imp
  • 在多个提升组件之间共享服务

    我创建了两个单独提升的组件 在两个不同的视图中 并且我尝试在这两个组件之间共享一个独特的服务 单例 该服务用于操作这些组件之一 我的服务 Injectable export class ModalContainerService priva
  • 不允许 Nuget 和 Teamcity Agent 运行此配置

    我遇到了一个有趣的问题 我想使用 Teamcity 构建 nuget 包 我确实设置了非常简单的配置 干得好 JetBrains 但是我无法在我们的构建代理之一上运行它 该代理确实通过了配置的代理要求 但在其名称旁边显示以下内容 不允许运行
  • 如何在 IDEA 中从 Gradle 设置 checkstyle 配置

    我在 IDEA 中使用 Checkstyle 插件 我想为不同的模块设置不同的 checkstyle 配置 我使用 gradle 作为构建工具 版本 4 我想编写一个修改模块相应 iml 文件的任务 知道怎么做吗 我第一次尝试修改iml文件
  • 如何水平对齐跨度文本和输入元素

    我正在努力创建一个搜索表单 在这个搜索表单中 我使用了
  • CMake Eclipse 构建配置

    我想使用 CMake 生成 Eclipse CDT 项目 其中生成的 Eclipse 项目包含定义的构建类型作为 IDE 中的可选构建配置 例如 if CMAKE CONFIGURATION TYPES set CMAKE CONFIGUR
  • Networkx:使用公共函数进行边权重计算

    假设我有一个函数euc 2d graph n1 n2 计算同一图的两个节点之间的欧几里德距离 每个节点都有一个给定的pos x y 这是在图创建时分配的 NetworkX 提供了一个函数来获取图的所有边的总权重 即graph size we
  • 如何返回带有捕获的 unique_ptr 的 lambda [重复]

    这个问题在这里已经有答案了 使用这个 https stackoverflow com a 16968463 629530 https stackoverflow com a 16968463 629530 我可以在 lambda 中捕获 u
  • 密码自动完成功能不适用于我的网络应用程序(在 Firefox 中)

    我已经用 HTML 创建了一个登录提交表单 但由于某种原因 自动完成功能在 Firefox 中不起作用 这是 Firefox 中发生的情况 我提供用户名和密码 然后单击登录按钮 Firefox 会提示我是否要记住密码 我按 记住 并登录即可
  • Vagrant 来测试厨师食谱 - 但如何处理私人 git

    我使用 vagrant 来测试我的厨师食谱 问题是我已经克隆了我的私人存储库并且机器没有被认证 我如何自动对 boostrap Chef 进行 git 身份验证 我正在使用 vagrant ubuntu 11 10 with Chef Th
  • throw new TypeError('OAuth2Strategy 需要 clientID 选项'); }

    这是出现的错误 该怎么办 我创建了一个 socket io 聊天应用程序 这是一个使用 nodejs socket io 和 package json 的聊天应用程序 包 json dependencies body parser 1 15
  • 如果在构造函数中设置 DataContext,在调用 InitializeComponent() 之前还是之后设置它有什么关系吗?

    我有一个 WPF 窗口 它在构造函数中接受一些参数 然后我使用这些构造函数来设置窗口的状态 该构造函数过程的一部分是实例化我的视图模型类 然后将其设置为窗口DataContext 我的问题是我什么时候应该设置我的DataContext等于我
  • 在 Powershell 中捕获 Windows 窗体关闭事件

    我有一个窗口窗体 当我单击 Windows 窗体控制框的关闭 X 按钮时 我想显示一条消息或可能执行某些操作 下面是代码 void System Reflection Assembly LoadWithPartialName System
  • 你应该在 Github 上分叉还是分支? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 许多 github 存储库要求在每次重要的代码更改时创建一个分支 这与 git 中的分支完全相同 为什么github要引入forks 我喜欢 g
  • 为类变量赋值是为该对象的所有实例分配它

    我有一个带字典的课 我创建了该类的 n 个实例 当我 该字典中某个键上的值时 它会反映在我从该对象实例化的每个对象中 如何使该字典对于该类的每个实例都是唯一的 这是我创建对象的方法 for num in range 0 numOfPlaye
  • WAMP 服务器 Apache 无法启动

    有几个主题与此非常相似 但是 在查看了已解决的主题后 我没有遇到相同的问题 其余的也没有解决 我已经安装了新版本的 WAMP 没有对任何文件进行任何更改 打开 wamp 图标永远不会从红色变为绿色 放到网上就报错 无法执行菜单项 内部错误
  • 创建多行取决于特殊条件[重复]

    这个问题在这里已经有答案了 我的 data frame 如下 duration classlabel 100 W 120 1 390 2 30 3 30 2 150 3 30 4 60 3 60 4 30 3 120 4 30 3 120
  • 左侧 -> 右侧和顶部 -> 底部位置之间的 CSS 过渡

    是否可以使用 CSS 过渡在位置集之间设置动画left 0px to right 0px所以它一直穿过屏幕 我需要从上到下完成同样的事情 我是否卡住了计算屏幕宽度 对象大小 nav position absolute top 0px lef
  • 用Python创建图片蒙太奇

    我没有使用 python 的经验 但该脚本的所有者没有响应 当我将照片拖到此脚本上以创建蒙太奇时 它最终会切掉右侧边缘最后一张照片的一半 4张图片宽 1 2 3 4 5 6 7 8 图4和图8通常会减半 那里有图片的空间 虽然是空白的 我想