【问题标题】:Cannot save multiple files with PIL save method无法使用 PIL 保存方法保存多个文件
【发布时间】:2021-06-16 18:23:40
【问题描述】:

我已经修改了一个 vk4 转换器以允许将多个 .vk4 文件转换为 .jpg 图像文件。运行时,IDLE 不会给我一个错误,但它只在结束进程之前设法转换一个文件。我认为问题在于 image.save() 似乎只影响单个文件,并且我未能成功循环该命令以扩展到目录中的所有其他文件。

代码:

import numpy as np
from PIL import Image
import vk4extract
import os

os.chdir(r'path\to\directory')
root = ('.\\')
vkimages = os.listdir(root)

for img in vkimages:
    if (img.endswith('.vk4')):
        with open(img, 'rb') as in_file:
            offsets = vk4extract.extract_offsets(in_file)
            rgb_dict = vk4extract.extract_color_data(offsets, 'peak', in_file)

            rgb_data = rgb_dict['data']
            height = rgb_dict['height']
            width = rgb_dict['width']

            rgb_matrix = np.reshape(rgb_data, (height, width, 3))
            image = Image.fromarray(rgb_matrix, 'RGB')

            image.save('sample.jpeg', 'JPEG')

在使用 PIL 模块时如何防止转换后的文件被覆盖?

谢谢。

【问题讨论】:

    标签: python save python-imaging-library jpeg enumerate


    【解决方案1】:

    它会保存每个文件,但由于您始终为每个文件提供相同的名称 (image.save('sample.jpeg', 'JPEG')),因此只会保存最后一个文件,而所有其他文件都将被覆盖。您需要为每个文件指定不同的名称。有几种方法可以做到这一点。一种是在循环使用enumerate()时添加索引:

    for i, img in enumerate(vkimages):
    

    然后在保存时使用文件名上的i:

    image.save(f'sample_{i}.jpeg', 'JPEG')
    

    另一种方法是使用原始文件名和replace 扩展名。从您的代码看来,这些文件是 .vk4 文件。所以另一种可能性是使用相同的名称保存,但将 .vk4 替换为 .jpeg:

    image.save(img.replace('.vk4', '.jpeg'), 'JPEG')
    

    【讨论】:

    • 这非常有效。非常感谢。
    猜你喜欢
    • 2022-01-14
    • 2018-01-15
    • 1970-01-01
    • 2021-09-07
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    相关资源
    最近更新 更多