我正在编写一个程序,该程序在卫星图像目录上进行迭代,将每个图像裁剪为具有纵横比(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
。我已经看过here和here进行了澄清,但是都没有使用os
模块,我很确定这是我遇到问题的地方。
在此先感谢您提供的帮助。
答案 0 :(得分:0)
如果image.filename
返回完整的图像路径,则只能通过以下方式获取文件名:
image_filename = os.path.basename(image.filename)