5

所以这是我的困境......我正在编写一个脚本,它从文件夹中读取所有 .png 文件,然后将它们转换为我在列表中指定的多个不同维度。一切正常,除了在处理一张图像后退出。

这是我的代码:

sizeFormats = ["1024x1024", "114x114", "40x40", "58x58", "60x60", "640x1136", "640x960"]

def resizeImages():

widthList = []
heightList = []
resizedHeight = 0
resizedWidth = 0

#targetPath is the path to the folder that contains the images
folderToResizeContents = os.listdir(targetPath)

#This splits the dimensions into 2 separate lists for height and width (ex: 640x960 adds
#640 to widthList and 960 to heightList
for index in sizeFormats:
    widthList.append(index.split("x")[0])
    heightList.append(index.split("x")[1])

#for every image in the folder, apply the dimensions from the populated lists and save
for image,w,h in zip(folderToResizeContents,widthList,heightList):
    resizedWidth = int(w)
    resizedHeight = int(h)
    sourceFilePath = os.path.join(targetPath,image)
    imageFileToConvert = Image.open(sourceFilePath)
    outputFile = imageFileToConvert.resize((resizedWidth,resizedHeight), Image.ANTIALIAS)
    outputFile.save(sourceFilePath)

如果目标文件夹包含 2 个名为 image1.png,image2.png 的图像,则将返回以下内容(为了可视化,我将在下划线后添加应用于图像的尺寸):

image1_1024x1024.png, ................., image1_640x690.png (返回 image1 的所有 7 个不同尺寸)

当我需要它对 image_2 应用相同的转换时,它会停在那里。我知道这是因为 widthList 和 heightList 的长度只有 7 个元素长,因此在 image2 轮到它之前退出循环。有什么办法可以为targetPath中的每个图像循环遍历widthList和heightList?

4

3 回答 3

4

为什么不保持简单:

for image in folderToResizeContents:
    for fmt in sizeFormats:
        (w,h) = fmt.split('x')

注意您正在覆盖生成的文件,因为您没有更改输出路径的名称。

于 2013-06-25T19:22:10.650 回答
0

您需要重新遍历每个文件的 sizeFormats。除非您对高度和宽度的循环迭代器变得更加棘手,否则 Zip 不会这样做。

有时,当几个嵌套的 for 循环正常工作时,诸如 zip 之类的工具会生成更长更复杂的代码。我认为它比分成多个列表然后再将它们重新组合在一起更直接。

sizeFormats = ["1024x1024", "114x114", "40x40", "58x58", "60x60", "640x1136", "640x960"]
sizeTuples = [(int(w), int(h)) for w,h in map(lambda wh: wh.split('x'), sizeFormats)]

def resizeImages():

    #for every image in the folder, apply the dimensions from the populated lists and save
    for image in os.listdir(targetPath):
        for resizedWidth, resizedHeight in sizeTuples:
            sourceFilePath = os.path.join(targetPath,image)
            imageFileToConvert = Image.open(sourceFilePath)
            outputFile = imageFileToConvert.resize((resizedWidth,resizedHeight), Image.ANTIALIAS)
            outputFile.save(sourceFilePath)
于 2013-06-25T19:22:55.860 回答
0

嵌套你的 for 循环,你可以将所有 7 个维度应用于每个图像

for image in folderToResizeContents:
    for w,h in zip(widthList,heightList):

第一个 for 循环将确保它发生在每个图像上,而第二个 for 循环将确保图像被调整到每个大小

于 2013-06-25T19:09:31.267 回答