gpt4 book ai didi

python - 如何避免在每次 model.save() 调用时创建图像缩略图?

转载 作者:行者123 更新时间:2023-12-04 07:38:06 25 4
gpt4 key购买 nike

我正在创建一个新闻博客,所以我决定添加一个个人资料图片。我在想,如何更好地创建图像缩略图并决定使用百分比调整大小。

def save(self, *args, **kwargs):
image = Image.open(self.image) # Открываем картинку
width, height = image.size # Получаем размеры картинки
new_image = BytesIO() # Создаем байтовое представление

resize = (width * (height // 10 * 5) // height, height // 10 * 5) # Изменение по высоте

if width > height: # Если горизонтальная картинка
resize = (width // 10 * 5, height * (width // 10 * 5) // width) # Изменение по ширине

image.thumbnail(resize, resample=Image.ANTIALIAS) # Делаем миниатюру картинки
image = image.convert('RGB') # Убираем все лишние каналы
image.save(new_image, format='JPEG', quality=90) # Конвертируем в JPEG, ибо мало весит

new_image.seek(0) # Возвращение в начало файла

name = f'{self.image.name.split(".")[0]}.jpeg' # Имя файла

# Перезапись файла в базе данных
self.image = InMemoryUploadedFile(
new_image, 'ImageField', # Картинка, поля сохранения
name, 'image/jpeg', # Имя картинки, содержание
getsizeof(new_image), None # Размер, доп инфа
)
# Сохранение через другой save класса
super(KvantUser, self).save(*args, **kwargs)
所以,正如你所看到的,我只取了图像大小的一半。它有助于保持图像的良好质量并减小其尺寸。但是这种方法会导致另一个问题。
每次,当 save()方法调用,图像变得越来越小...
我试图重写我的更改表单,但没有帮助。
据我所知,Django 调用 save()每次更改模型或登录系统时的方法。所以,我需要帮助来解决这个问题。也许最好创建一个固定的缩略图,或者你知道一个更好的方法来做到这一点。随意提出任何想法!
我的模型.py
def set_default_image():
bucket = S3Boto3Storage()
if not bucket.exists('default/user/user.png'):
with open(join(settings.MEDIA_ROOT + '/default/user.png'), 'b+r') as f:
bucket.save('default/user/user.png', f)
return 'default/user/user.png'


def get_path(instance, filename):
return f'user/{instance.username}/{filename}'


class KvantUser(AbstractUser):
name = models.CharField(max_length=100)
surname = models.CharField(max_length=100)
patronymic = models.CharField(max_length=100)
permission = models.CharField(choices=permission, max_length=100)
color = models.CharField(max_length=100, choices=color, default='blue')
theme = models.CharField(max_length=100, choices=theme, default='light')
image = models.ImageField(upload_to=get_path, default=set_default_image)
我的表格.py
class KvantUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = KvantUser
fields = ('username', 'email', 'password', 'name', 'surname', 'patronymic', 'image')


class KvantUserChangeForm(UserChangeForm):
class Meta:
model = KvantUser
fields = ('username', 'email', 'password', 'name', 'surname', 'patronymic', 'image')


class KvantUserLoginForm(forms.Form):
username = forms.CharField(max_length=150)
password = forms.CharField(max_length=150)

def save(self, request):
username = self.cleaned_data['username'] # Получение логина
password = self.cleaned_data['password'] # Получение пароля

if KvantUser.objects.filter(username=username).exists(): # Проверка существования акаунта
user = authenticate(username=username, password=password) # Попытка авторизации
if user is not None: # Если попытка удачна, то авторизуй и верни пользователя
login(request, user)
return user
messages.error(request, 'Ошибка авторизации!') # Сообщение об ощибки
return None
P.S 如果您需要其他文件,请随时询问。

最佳答案

如果您只想在 KvantUser 时创建缩略图创建实例后,您可以检查 pk在使用您的逻辑调整图像大小之前存在:

def save(self, *args, **kwargs):
if self.pk is None:
# Your code to make the thumbnail here
super(KvantUser, self).save(*args, **kwargs)
但是还有一个更好的方法,就是把这个逻辑放在 中表格 本身,因为你有这个模型的多种形式,写一个 mixin 并以这些形式继承它:
class ImageThumbnailFormMixin:
def clean_image(self):
f = self.cleaned_data.get('image')
if not f:
return f
image = f.image # A PIL Image object that Django has annotated here
# Make the thumbnail here with the `image` object
image.save()
return f


class KvantUserCreationForm(ImageThumbnailFormMixin, UserCreationForm):
class Meta(UserCreationForm):
model = KvantUser
fields = ('username', 'email', 'password', 'name', 'surname', 'patronymic', 'image')


class KvantUserChangeForm(ImageThumbnailFormMixin, UserChangeForm):
class Meta:
model = KvantUser
fields = ('username', 'email', 'password', 'name', 'surname', 'patronymic', 'image')

关于python - 如何避免在每次 model.save() 调用时创建图像缩略图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67641688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com