#python #save #python-imaging-library #jpeg #enumerate
Вопрос:
Я модифицировал конвертер vk4, чтобы он позволял конвертировать несколько файлов .vk4 в файлы изображений .jpg. При запуске IDLE не выдает мне ошибку, но ему удается преобразовать только один файл перед завершением процесса. Я полагаю, что проблема в том, что image.save (), похоже, влияет только на один файл, и мне не удалось выполнить эту команду для распространения на все остальные файлы в каталоге.
Код:
import numpy as np
from PIL import Image
import vk4extract
import os
os.chdir(r'pathtodirectory')
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?
Спасибо.
Ответ №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')
Комментарии:
1. Это прекрасно работает. Большое спасибо.