调整图像大小时的无限循环

问题描述 投票:-1回答:3

我正在运行我的代码来调整目录中的所有图像,但是代码会进行无限循环。图像调整大小我想要的我只是无法弄清楚如何使它在一次通过后停止。另外我想将输出指定为.jpg文件类型。

import os, sys
from PIL import Image
import glob as glob

MY_DIRECTORY = "C:\\Users\\rzara\\Desktop\\sample_skulls"
for root, subdirs, files in os.walk(MY_DIRECTORY):
    for filename in files:
        for filename in glob.glob(MY_DIRECTORY+"/*.jpg"):
            size = 250, 250
            file_parts = os.path.splitext(filename)
            outfile = file_parts[0] + '_250x250' + file_parts[1]
            try:
                img = Image.open(filename)
                img = img.resize(size, Image.ANTIALIAS)
                img.save(outfile)
            except IOError as e:
                print("An exception occured '%s'" %e)

我尝试将保存行更改为:

img.save(outfile,'jpg')

但是这给出了以下错误:

line 1983, in save 
save_handler = SAVE[format.upper()]
KeyError: 'JPG'
python python-3.x image infinite-loop image-resizing
3个回答
0
投票

我看到两个问题。

首先,您调用walkglob,并迭代两者的结果。这意味着如果你的目录包含五个文件并且它们都满足glob的模式,你将遍历五个文件五次,总共二十五次。你应该只有一个for filename循环。

其次,“jpg”似乎不是supported PIL file format。但是,“JPEG”是。试试吧。 (是的,我觉得很奇怪img.save("result.jpg")知道结果应该是jpeg,但是img.save("result", "jpg")没有。有时库很奇怪。)

总之,结果可能如下:

import os, sys
from PIL import Image
import glob as glob

MY_DIRECTORY = "C:\\Users\\rzara\\Desktop\\sample_skulls"
for filename in glob.glob(MY_DIRECTORY+"/*.jpg"):
    size = 250, 250
    file_parts = os.path.splitext(filename)
    outfile = file_parts[0] + '_250x250' + file_parts[1]
    img = Image.open(filename)
    img = img.resize(size, Image.ANTIALIAS)
    img.save(outfile, 'jpeg')

0
投票

你可以在程序结尾添加以下3行来查找try可能遇到的任何其他错误吗?

    except Exception as message:
        print('general exception')
        print(message)

0
投票
for filename in files:
    for filename in glob.glob(MY_DIRECTORY+"/*.jpg"):

您从files获取文件名,但立即将其替换为来自不同来源的一系列文件名。虽然这不是,事实上,一个无限循环,它强烈暗示你有一个严重的结构错误。

© www.soinside.com 2019 - 2024. All rights reserved.