Не удается сохранить несколько файлов с помощью метода сохранения PIL

#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. Это прекрасно работает. Большое спасибо.