为什么我的裁切后的图像会保存到错误的目录中?

时间:2018-10-22 21:22:09

标签: python python-3.x operating-system python-imaging-library

我正在编写一个程序,该程序在卫星图像目录上进行迭代,将每个图像裁剪为具有纵横比(1:1),然后将裁剪后的图像保存在程序开始时创建的其他目录中。我能够成功裁剪每张图像,但是裁剪后的图像将保存到其原始目录,而不是在程序开始时创建的图像。

例如,导致但不包括包含图像的目录的文件路径为C:\Users\nickm\Documents\Projects\Platform\Imagery,而包含附属图像的目录为dirImagery的子目录)。裁剪完每张图像后,我想将其保存到程序开始时创建的目录中(例如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_pathimage_dir由用户在命令行中提供,并用作我们的make_new_dircrop_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。我已经看过herehere进行了澄清,但是都没有使用os模块,我很确定这是我遇到问题的地方。

在此先感谢您提供的帮助。

1 个答案:

答案 0 :(得分:0)

如果image.filename返回完整的图像路径,则只能通过以下方式获取文件名:

image_filename = os.path.basename(image.filename)