无法使用 PIL 保存方法保存多个文件
Cannot save multiple files with PIL save method
我修改了一个 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模块时防止转换后的文件被覆盖?
谢谢。
它正在保存每个文件,但由于您总是为每个文件提供相同的名称(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')
我修改了一个 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模块时防止转换后的文件被覆盖?
谢谢。
它正在保存每个文件,但由于您总是为每个文件提供相同的名称(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')