Python 图像未正确关闭?
我正在覆盖“保存模型”功能,以便在保存前调整配置文件图片的大小。我的函数如下所示:Python 图像未正确关闭?,python,django,django-models,python-imaging-library,Python,Django,Django Models,Python Imaging Library,我正在覆盖“保存模型”功能,以便在保存前调整配置文件图片的大小。我的函数如下所示: def save(self, *args, **kwargs): super(Profile, self).save(*args, **kwargs) if self.avatar: with Image.open(self.avatar) as image: image_path = self.avatar.path image_
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
if self.avatar:
with Image.open(self.avatar) as image:
image_path = self.avatar.path
image_name = self.avatar.path[:-4]
image_ext = self.avatar.path[-4:]
resize_images(image, image_path, image_name, image_ext)
image.close()
def resize_images(image, image_path, image_name, image_ext):
image = image.resize((400, 400), Image.ANTIALIAS)
image.save(image_path, optimize=True, quality=95)
medium_image = image.resize((250, 250), Image.ANTIALIAS)
image.close()
medium_path = image_name + "_medium" + image_ext
medium_image.save(medium_path, optimize=True, quality=95)
small_image = medium_image.resize((100, 100), Image.ANTIALIAS)
small_path = image_name + "_small" + image_ext
small_image.save(small_path, optimize=True, quality=95)
medium_image.close()
mini_image = small_image.resize((50, 50), Image.ANTIALIAS)
mini_path = image_name + "_mini" + image_ext
mini_image.save(mini_path, optimize=True, quality=95)
small_image.close()
mini_image.close()
我的resize_images
函数如下所示:
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
if self.avatar:
with Image.open(self.avatar) as image:
image_path = self.avatar.path
image_name = self.avatar.path[:-4]
image_ext = self.avatar.path[-4:]
resize_images(image, image_path, image_name, image_ext)
image.close()
def resize_images(image, image_path, image_name, image_ext):
image = image.resize((400, 400), Image.ANTIALIAS)
image.save(image_path, optimize=True, quality=95)
medium_image = image.resize((250, 250), Image.ANTIALIAS)
image.close()
medium_path = image_name + "_medium" + image_ext
medium_image.save(medium_path, optimize=True, quality=95)
small_image = medium_image.resize((100, 100), Image.ANTIALIAS)
small_path = image_name + "_small" + image_ext
small_image.save(small_path, optimize=True, quality=95)
medium_image.close()
mini_image = small_image.resize((50, 50), Image.ANTIALIAS)
mini_path = image_name + "_mini" + image_ext
mini_image.save(mini_path, optimize=True, quality=95)
small_image.close()
mini_image.close()
当我保存一个图像时,它工作得很好,但是,当我在几秒钟后尝试上载另一个图像时,我遇到以下错误:
PermissionError:[WinError 32]进程无法访问该文件
因为它正被另一个进程使用:
'C:\Users\xx\xx\xx\media\Users\179\avatars
\179312.jpg'
罪魁祸首是resize_images
函数,因为当我将其注释掉时,每隔几秒钟重新加载一次后,这个错误就会消失。然而,我不明白我做错了什么。我正在关闭图像,但为什么它还在抱怨
编辑
每当我在resize\u images
功能中保存图像时,似乎都是真正的罪魁祸首
我也有这个存储功能:
avatar = models.ImageField(storage=OverwriteStorage(), upload_to=create_user_image_path, validators=[validate_avatar],
default="default/avatars/default.jpg")
class OverwriteStorage(FileSystemStorage):
def get_available_name(self, name, *args, **kwargs):
try:
file_path = os.path.dirname(name)
shutil.rmtree(os.path.join(settings.MEDIA_ROOT, file_path))
except FileNotFoundError:
pass
return name
尝试将
None
指定为用于文件上载的变量的值,上载文件后。@VasuDeo.S哪个变量确切?上载图像变量时使用的变量?作为旁注:最好使用splitext获取文件名和扩展名:尝试指定None
作为上载文件时使用的变量的值,上载文件后。@VasuDeo.S哪个变量确切?用于上载图像变量的变量?作为旁注:最好使用splitext获取文件名和扩展名: