【问题标题】:Item values in list iterator not updating列表迭代器中的项目值未更新
【发布时间】:2017-12-03 20:29:40
【问题描述】:

我有一些代码循环通过properties of logos,这些属性本身就变成了 logos。

问题是,我有一个“AntiAliasing / SuperSampling”功能来检查properties["antialias"] == True

如果启用了 AA,它会临时将某些尺寸调整属性覆盖为三倍大小,进行渲染,然后缩小到原始尺寸(除以三)。

下面是重要的一小段代码:

if properties["antialias"]:
    properties["font_size"] *= 3
    properties["base_size"] = (properties["base_size"][0] * 3,
                               properties["base_size"][1] * 3)
    properties["padding"] = (properties["padding"][0] * 3,
                             properties["padding"][1] * 3)

在那里你可以看到font_size(tuple) base_size(tuple) padding 都乘以三。这就是已加载的属性中的所有尺寸信息。

因此,在此之后,图像由 PIL(Pillow)生成,然后通过以下方式缩小图像:

if properties["antialias"]:
    logo_image = logo_image.resize((round(logo_image.width  / 3),
                                    round(logo_image.height / 3)), Image.ANTIALIAS)

问题在于,第一张图片效果很好。然后,由该循环生成的其他图像都在以 3 的 指数增长。这显然是不是指数代码。

我得出的结论是,调用的每个“属性”(每个循环使用的项目)字典都没有改变(可能只是修改后的值),而是反复乘以三。

(基本上我认为更改的值在每个循环中都保持不变。)

这是你所期望的循环:

for properties in logo_list:

这里是完整的代码,如果您需要阅读它。它从外部范围变量和其他函数调用,但我不认为这对这个问题很重要。

for properties in logo_list:
    if weight in properties["weights"]:
        logo_name = "".join([region["text"] for region in properties["regions"]])
        logo_file = logo_name + "-" + file[:-4] + "." + properties["type"].lower()
        out_dir = os.path.join("out", logo_name)

        try:
            os.makedirs(out_dir)
        except FileExistsError:
            pass

        if properties["antialias"]:
            properties["font_size"] *= 3
            properties["base_size"] = (properties["base_size"][0] * 3,
                                       properties["base_size"][1] * 3)
            properties["padding"] = (properties["padding"][0] * 3,
                                     properties["padding"][1] * 3)

        logo_image = generate(properties, font_path)

        if properties["shrink"]:
            logo_image = logo_image.crop(logo_image.getbbox())

        if properties["padding"]:
            logo_image = padding(properties, logo_image)

        if properties["antialias"]:
            logo_image = logo_image.resize((round(logo_image.width  / 3),
                                            round(logo_image.height / 3)), Image.ANTIALIAS)

        if properties["background"]:
            logo_image = background(properties, logo_image)

        logo_image.save(os.path.join(out_dir, logo_file), properties["type"])

Since people asked, here is the absolute full code.

【问题讨论】:

  • 你的generate()函数是做什么的?我们能看到吗?这可能会有所帮助,因为这似乎会在调整大小的代码期间创建您实际使用的图像,这会给您带来问题。
  • 添加到底部。所有文件都在那里。

标签: python image python-3.x scope iterator


【解决方案1】:

已编辑:您正在循环文件,然后为每个文件循环 logo_list。然后修改 logo_list 的项目。所以第二个文件将使用 logo_list 及其修改的项目。这意味着您每次乘以 3,从而产生指数增长。

【讨论】:

  • logo_list 只是 JSON 格式的 this
  • 那我就没法解释了。包括整个程序,也许其他的东西会变得明显。
  • 我将代码添加到the same gist
  • @NedBatchelder 是对的。您应该在循环上方添加logo_list = load(open("settings.json")) for properties in logo_list:,以便为每个文件调用它。
  • 谢谢。我将其更改为:for properties in load(open("settings.json")): 我没有意识到properties 在该实例之外是可变的。有没有更好的方法来做到这一点而不会改变太多以防止每次迭代都重新加载文件?如果您有一个巧妙的技巧,请将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多