Django 图像保存
Django image saving
我想知道在 Django 中将图像保存到 ImageField 中的最佳做法是什么?
class Image(models.Model):
image = ...
def save(self, *args, **kwargs):
... # resizing and saving the image
super().save(*args, **kwargs)
我想保存图片但不是原始尺寸。我只想保存调整大小的图像。据我所知,这里的super save方法另外将原始图像保存到数据库中。但我希望它只保存调整大小以防止数据溢出。怎么做?
您可以通过以下方式进行
我会把函数放在这里,但是你可以把它们放在另一个文件中以重用它们然后导入它们,我会添加必要的库
import PIL
from io import BytesIO
from PIL import Image
from django.core.files import File
class Image(models.Model):
image = models.FileField()
def save(self, *args, **kwargs):
new_image = self.compress_images(self.image)
# asignar la nueva imagen con menor peso
self.image = new_image
super().save(*args, **kwargs)
def valid_extension(self,_img):
if '.jpg' in _img:
return "JPEG"
elif '.jpeg' in _img:
return "JPEG"
elif '.png' in _img:
return "PNG"
def compress_images(self,image):
im = Image.open(image)
width, height = im.size
im = im.resize((width-50, height-50), PIL.Image.ANTIALIAS)
# crear a BytesIO object
im_io = BytesIO()
im.save(im_io, self.valid_extension(image.name) ,optimize=True,
quality=70)
new_image = File(im_io, name=image.name)
return new_image
我想知道在 Django 中将图像保存到 ImageField 中的最佳做法是什么?
class Image(models.Model):
image = ...
def save(self, *args, **kwargs):
... # resizing and saving the image
super().save(*args, **kwargs)
我想保存图片但不是原始尺寸。我只想保存调整大小的图像。据我所知,这里的super save方法另外将原始图像保存到数据库中。但我希望它只保存调整大小以防止数据溢出。怎么做?
您可以通过以下方式进行 我会把函数放在这里,但是你可以把它们放在另一个文件中以重用它们然后导入它们,我会添加必要的库
import PIL
from io import BytesIO
from PIL import Image
from django.core.files import File
class Image(models.Model):
image = models.FileField()
def save(self, *args, **kwargs):
new_image = self.compress_images(self.image)
# asignar la nueva imagen con menor peso
self.image = new_image
super().save(*args, **kwargs)
def valid_extension(self,_img):
if '.jpg' in _img:
return "JPEG"
elif '.jpeg' in _img:
return "JPEG"
elif '.png' in _img:
return "PNG"
def compress_images(self,image):
im = Image.open(image)
width, height = im.size
im = im.resize((width-50, height-50), PIL.Image.ANTIALIAS)
# crear a BytesIO object
im_io = BytesIO()
im.save(im_io, self.valid_extension(image.name) ,optimize=True,
quality=70)
new_image = File(im_io, name=image.name)
return new_image