Я пишу программу, которая выполняет итерацию по каталогу спутниковых изображений, обрезает каждое изображение с квадратным соотношением сторон (1: 1), а затем сохраняет обрезанное изображение в другом каталоге, созданном в начале программы.,Я могу успешно обрезать каждое изображение, но обрезанное изображение сохраняется в исходном каталоге вместо того, который был создан в начале программы.
Например, путь к файлу, который ведет, но не включает в себя, каталог, содержащий изображения, равен C:\Users\nickm\Documents\Projects\Platform\Imagery
, а каталог, содержащий спутниковые изображения, - dir
(подкаталог Imagery
).После обрезки каждого изображения я хочу сохранить его в каталоге, созданном при запуске программы (например, 10-22-18 cropped
, который также будет подкаталогом Imagery
).Вместо этого он сохраняется в dir
, перезаписывая исходное изображение.
Вот мой код:
# image.py
import datetime
import os
from PIL import Image
def make_new_dir(abs_path):
'''Creates the directory where our cropped imagery will be saved and
returns its absolute file path.
'''
date_obj = datetime.datetime.now()
date = date_obj.strftime('%x').replace('/', '-')
new_path = abs_path + '/' + date + ' cropped'
os.mkdir(new_path)
return new_path
def get_crop_area(image):
'''Crops each image to have a square aspect ratio (1:1) using the
image's size.
'''
image_width, image_height = image.size
diff = max(image_width, image_height) - min(image_width, image_height)
if image_width > image_height:
return [diff / 2, 0, image_width - diff / 2, image_height]
else:
return [0, diff / 2, image_width, image_height - diff / 2]
def crop_images(abs_path, image_dir, new_dir):
'''Iterates over the directory containing the satellite images
(abs_path + image_dir), cropping each image and saving it to our
new directory (the value returned from our make_new_dir function).
'''
new_dir = os.path.abspath(new_dir)
image_dir = os.path.join(abs_path, image_dir)
images = os.listdir(image_dir)
for image in images:
image_path = os.path.join(image_dir, image)
image = Image.open(image_path)
crop_area = get_crop_area(image)
cropped_image = image.crop(crop_area)
cropped_image_path = os.path.join(new_dir, image.filename)
cropped_image.save(cropped_image_path, 'JPEG')
Программа запускается с run.py
.abs_path
и image_dir
предоставляются пользователем в командной строке и используются в качестве аргументов в наших функциях make_new_dir
и crop_images
.Вот как это выглядит, когда я запускаю свой скрипт из командной строки:
C:\Users\nickm\Documents\Projects\Code\image>python run.py C:\Users\nickm\Documents\Projects\Platform\Imagery dir
Обратите внимание, что абсолютный путь к файлу и каталог, содержащий изображения, являются двумя разными аргументами командной строки.
Вот мой run.py
скрипт:
# run.py
import sys
from image import make_new_dir, get_crop_area, crop_images
if __name__ == '__main__':
filename, abs_path, image_dir = sys.argv
new_dir = make_new_dir(abs_path)
crop_images(abs_path, image_dir, new_dir)
Это первая созданная мной программа, которая не является простым упражнением по кодированию, поэтому мне интересно, могу ли янеправильно реализует os.path.join
.Я посмотрел здесь и здесь для разъяснения, но ни один из них не использует модуль os
, который, я уверен, именно там я сталкиваюсь с моей проблемой.
Заранее благодарим за предоставленную помощь.