def converter_compressor(content, max_width, max_height):
content.file.seek(0)
image = Image.open(content.file)
(w, h) = image.size
if w > max_width:
img_ratio = int(float(image.size[0]) / max_width)
new_height = int(float(image.size[1]) / img_ratio)
image = image.resize((max_width, new_height), Image.LANCZOS)
elif h > max_height:
img_ratio = int(float(image.size[1]) / max_height)
new_width = int(float(image.size[0]) / img_ratio)
image = image.resize((new_width, max_height), Image.LANCZOS)
else:
image = image.resize(image.size, Image.LANCZOS)
image_bytes = io.BytesIO()
image.save(fp=image_bytes, format="WEBP")
image_content_file = ContentFile(content=image_bytes.getvalue())
return image_content_file
class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True):
image_content_file = converter_compressor(content, 300, 300)
super().save(name, image_content_file, save)
class WEBPThumbnail(models.ImageField):
attr_class = WEBPThumbnailImg
class WEBPThumbnailImg(ImageFieldFile):
def __init__(self, *args, **kwargs):
self.max_width = kwargs.pop('max_width', 300)
self.max_height = kwargs.pop('max_height', 200)
super().__init__(*args, **kwargs)
def save(self, name, content, save=True, max_width=None, max_height=None):
content.file.seek(0)
image = Image.open(content.file)
max_width = self.max_width
max_height = self.max_height
(w, h) = image.size
if w > max_width:
img_ratio = int(float(image.size[0]) / max_width)
new_heigh = int(float(image.size[1]) / img_ratio)
image = image.resize((max_width, new_heigh), Image.LANCZOS)
elif h > max_height:
img_ratio = int(float(image.size[1]) / max_height)
new_width = int(float(image.size[0]) / img_ratio)
image = image.resize((new_width, max_height), Image.LANCZOS)
else:
image = image.resize(image.size, Image.LANCZOS)
image_bytes = io.BytesIO()
image.save(fp=image_bytes, format="WEBP")
image_content_file = ContentFile(content=image_bytes.getvalue())
super().save(name, image_content_file, save)
class WEBPThumbnail(models.ImageField):
attr_class = WEBPThumbnailImg # атрибут
def __init__(self, *args, **kwargs):
self.max_width = kwargs.pop('max_width', 200)
self.max_height = kwargs.pop('max_height', 200)
super().__init__(*args, **kwargs)
зачем вам это Django?))
Попробуйте так:
def save(self, name, content, save=True, max_width=None, max_height=None):
не помогает... у самого голова уже пухнет....max_width = self.max_width
max_height = self.max_height
class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True):
content.file.seek(0)
image = Image.open(content.file)
max_width = self.max_width
max_height = self.max_height
(w, h) = image.size
if w > max_width:
img_ratio = (float(image.size[0]) / max_width)
new_heigh = int(float(image.size[1]) / img_ratio)
image = image.resize((max_width, new_heigh), Image.LANCZOS)
elif h > max_height:
img_ratio = (float(image.size[1]) / max_height)
new_width = int(float(image.size[0]) / img_ratio)
image = image.resize((new_width, max_height), Image.LANCZOS)
else:
image = image.resize(image.size, Image.LANCZOS)
image_bytes = io.BytesIO()
image.save(fp=image_bytes, format="WEBP")
image_content_file = ContentFile(content=image_bytes.getvalue())
super().save(name, image_content_file, save)
class WEBPThumbnail(models.ImageField):
attr_class = WEBPThumbnailImg
def __init__(self, *args, **kwargs):
self.max_width = kwargs.pop('max_width', 200)
self.max_height = kwargs.pop('max_height', 200)
super().__init__(*args, **kwargs)
def pre_save(self, model_instance, add):
file = super().pre_save(model_instance, add)
if file and not file._committed:
file.max_width = self.max_width
file.max_height = self.max_height
return file
class Category(models.Model):
name = models.CharField("Категория", max_length=100, db_index=True)
slug = models.SlugField("URL", max_length=44, unique=True, db_index=True)
# thumbnail = models.ImageField("Миниатюра", upload_to=upload_cats_thumbnail, blank=True)
thumbnail = WEBPThumbnail("Миниатюра", upload_to=upload_cats_thumbnail, blank=True, max_width=400, max_height=200 )
class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True):
content.file.seek(0)
image = Image.open(content.file)
max_width = self.max_width
thumbnail = WEBPThumbnail("Миниатюра", upload_to=upload_cats_thumbnail, blank=True, max_width=400, max_height=200 )
class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True):
content.file.seek(0)
image = Image.open(content.file)
# max_width = self.max_width
# max_height = self.max_height
(w, h) = image.size
if float(w > max_width):
Если вы хотите использовать класс в других проектах то первое, это не надо жестко кодировать max_width и max_height
class WEBPThumbnailImg(ImageFieldFile):
def save(self, name, content, save=True):
content.file.seek(0)
image = Image.open(content.file)
# max_width = 200
# max_height = 200
(w, h) = image.size
if float(w > max_width):
img_ratio = (float(image.size[0]) / max_width)
new_heigh = int(float(image.size[1]) / img_ratio)
image = image.resize((max_width, new_heigh), Image.LANCZOS)
elif h > max_height:
img_ratio = (float(image.size[1]) / max_height)
new_width = int(float(image.size[0]) / img_ratio)
image = image.resize((new_width, max_height), Image.LANCZOS)
else:
image = image.resize(image.size, Image.LANCZOS)
image_bytes = io.BytesIO()
image.save(fp=image_bytes, format="WEBP")
image_content_file = ContentFile(content=image_bytes.getvalue())
super().save(name, image_content_file, save)
Как вариант можно переименовать/удалить папки ранее используемых версий php ибо:
или пробовать с 8.0 что-то химичить...
насколько я прочесал темы, нормальной библиотеки под 8.2+ пока официально нет
через power shell командой php -i проверял, всегда показывало, что imagick есть и версия та, которую ставил.
Это говорит о том, что меняли вы не тот php.ini
На винде 10 стоит связка Nginx - Apache - PHP (7.4 и 8.0) в портабл режиме.
а также отсутствует инфа в php info.
, а так же отсутствует инфа в php info.
Если в варианте с "=" прописать полный точный путь с учётом регистра, то всё должно сработать
No errors detected.
Header version: 1.0
Using 3 out of 128 partitions.
A total of 4397 free sectors is available in 2 segments (the largest is 1.2 MiB).
если решать проблему с меньшим сопротивлением(для новичка) то можно загрузится с liveusb и удалив/уменьшив раздел подкачки сместить корневой раздел влево на освободившееся место а потом уже переносить.
сместить корневой раздел влево)
если вы про тест скорости то