Получено Errno 13 при попытке сохранить изображение с помощью Pillow [Python, Django]
При попытке сохранить изображения с помощью Pillow получена ошибка [Errno 13]. Точная ошибка такова: PermissionError: [Errno 13] Permission Denied: 'C:/Users/django/PycharmProjects/django/csvs/photos/blah-summer-jean\cropped-788x1000'. Мой код ниже:
from PIL import Image
from blah import settings
from django.core.files.storage import default_storage
from blah.storage_backends import MediaStorage
import os
app_storage = None
image_dir = 'C:/Users/django/PycharmProjects/sassigen/csvs/photos/blah-summer-jean'
cropped_dir = 'C:/Users/django/PycharmProjects/sassigen/csvs/photos/blah-summer-jean/cropped-788x1000'
if settings.DEBUG:
app_storage = default_storage
else:
app_storage = MediaStorage
def crop_image(image):
try:
img = Image.open(image)
width, height = img.size
if width <= 788 and height <= 1000:
pass
else:
xcenter = img.width / 2
ycenter = img.height / 2
x1 = xcenter - 488
y1 = ycenter - 600
x2 = xcenter + 488
y2 = ycenter + 600
image_to_crop = img.crop((int(x1), int(y1), int(x2), int(y2)))
output_size = (788, 1000)
final_image = image_to_crop.resize(output_size)
img.close()
return final_image
except AttributeError:
pass
except Exception as e:
raise e
for each_image in os.listdir(image_dir):
cropping = crop_image(os.path.join(image_dir, each_image))
if not os.path.exists(cropped_dir):
os.mkdir(cropped_dir)
cropping.save(os.path.join(cropped_dir, each_image), 'jpeg')
Черт, только что нашел решение самостоятельно. Вместо os.mkdir мне нужно использовать os.makedirs - потому что я именовал свой путь в коде прямым слешем вместо обратного слеша.
Рабочий код:
from PIL import Image
from blah import settings
from django.core.files.storage import default_storage
from blah.storage_backends import MediaStorage
import os
import imghdr
app_storage = None
image_dir = 'C:/Users/django/PycharmProjects/sassigen/csvs/photos/blah-summer-jean'
cropped_dir = 'C:/Users/django/PycharmProjects/sassigen/csvs/photos/blah-summer-jean/cropped-788x1000'
if settings.DEBUG:
app_storage = default_storage
else:
app_storage = MediaStorage
def crop_image(image):
try:
img = Image.open(image)
width, height = img.size
if width <= 788 and height <= 1000:
pass
else:
xcenter = img.width / 2
ycenter = img.height / 2
x1 = xcenter - 488
y1 = ycenter - 600
x2 = xcenter + 488
y2 = ycenter + 600
image_to_crop = img.crop((int(x1), int(y1), int(x2), int(y2)))
output_size = (788, 1000)
final_image = image_to_crop.resize(output_size)
img.close()
return final_image
except AttributeError:
pass
except Exception as e:
raise e
for each_image in os.listdir(image_dir):
if imghdr.what(os.path.join(image_dir, each_image)) == 'jpeg':
cropping = crop_image(os.path.join(image_dir, each_image))
if not os.path.exists(cropped_dir):
os.makedirs(cropped_dir)
cropping.save(os.path.join(cropped_dir, each_image), 'jpeg')