Почему мои обрезанные изображения сохраняются в неправильном каталоге? - PullRequest
0 голосов
/ 23 октября 2018

Я пишу программу, которая выполняет итерацию по каталогу спутниковых изображений, обрезает каждое изображение с квадратным соотношением сторон (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, который, я уверен, именно там я сталкиваюсь с моей проблемой.

Заранее благодарим за предоставленную помощь.

1 Ответ

0 голосов
/ 23 октября 2018

Если image.filename возвращает полный путь к изображению, вы можете получить только имя файла, выполнив это:

image_filename = os.path.basename(image.filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...