python - 如果图像大小为 GT 300KB,则 django-imagekit 压缩图像

标签 python django image django-imagekit

我已经成功安装(经过大量努力)django-imagekit我现在可以使用 django-imagekit压缩上传图片的文件大小。

我可以上传 6MB 的图片和 django-imagekit当我使用质量为 10 时(见下文),会将图像压缩到 230KB。

当上传的图像大小为 300Kb、1MB、2MB、3MB 或更大时(我在考虑 if/elseif/else 语句将确认图像的大小并应用较低的质量图像的大小 (KB) 越大? 10 的文件压缩适用于较大尺寸的图像,但从根本上降低了图像的质量image 适用于较小尺寸的图像,例如 25Kb。

我什至不确定我将如何编写代码以及我将实现该代码的位置。因此,我们将不胜感激。

这是我相关的models.py文件代码:

from imagekit.processors import Adjust, ResizeToFill
from imagekit.models import ProcessedImageField

class NameDetails(models.Model, FillableModelWithLanguageVersion):
    user = models.ForeignKey(User)
    ....
    #name_details_photograph = models.ImageField(upload_to=_get_name_details_photograph_upload_location, null=True, blank=True)
    name_details_photograph = ProcessedImageField(upload_to=_get_name_details_photograph_upload_location, null=True, blank=True, options={'quality': 25}, processors=[Adjust(sharpness=1.1),])
    ....

    def __unicode__(self):
        return unicode(self.user)

编辑:

我已经尝试实现 ProcessedImageField 类的表单字段版本,但这不会上传图像。

这是我在将 models.py 代码改回图像字段(上面已注释掉)时尝试使用的表单代码:

from imagekit.forms import ProcessedImageField
from imagekit.processors import Adjust, ResizeToFill

class NameDetailsForm(forms.ModelForm):

    def __init__(self, available_languages, language_preference, file_required, *args, **kwargs):
        """
        available_languages should be a valid choices list
        """
        super(NameDetailsForm, self).__init__(*args, **kwargs)
        self.fields['language_code'] = forms.ChoiceField(choices=available_languages, initial=language_preference, label=_('Language'),)
        #self.fields['name_details_photograph'] = forms.FileField(label=_('Photograph'), required=file_required)
        self.fields['name_details_photograph'] = ProcessedImageField(label=_('Photograph'), required=file_required, spec_id='myapp:profile:name_details_photograph', options={'quality': 25}, processors=[Adjust(sharpness=1.1),])

    class Meta:
        model = NameDetails

最佳答案

我要提供的解决方案完全未经测试。它基于 imagekit 的源代码图书馆。

options kwargImageSpec 使用类将其传递给 PIL 的 Image.save()

因此,对于动态 options,您可以创建自己的 Spec 类,将 options 定义为 property 并使用getter 返回一个动态的 options。像这样的东西:

from imagekit import ImageSpec
from imagekit.processors import Adjust, ResizeToFill

class ThumbnailSpec(ImageSpec):
    format = 'JPEG'
    options={'quality': 50}
    processors=[Adjust(sharpness=1.1),]

    @property
    def options(self):
        options = self._options
        #You can create some checks here and choose to change the options
        #you can access the file with self.source
        if self.source.size > 2*100*100:
            options['quality'] -= 25
        return options
    @options.setter
    def options(self, value):
        self._options = value

最后通过将 ThumbnailSpec 传递给 ProcessedImageField 来使用它

name_details_photograph = ProcessedImageField(
    upload_to=_get_name_details_photograph_upload_location, 
    null=True, 
    blank=True, 
    spec=ThumbnailSpec
)

关于python - 如果图像大小为 GT 300KB,则 django-imagekit 压缩图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29487369/

相关文章:

html - CSS 最大宽度 100% 响应式设计

Django 邮件发送错误,DEBUG=False

python - pip install openssl/aes.h 错误和 libxml/xmlversion.h 错误 (osx)

php - div 上的背景图片没有响应

Python 3 - Urllib3 读取互联网广播元数据

regex - 在 Django url 正则表达式模式中使用括号和破折号

c++ - C++ 中的图像边缘检测

Python:等价于闭包继承

python - 包含 JOIN 的 Django 多部分 ORM 查询

python - 高效的多精度数值数组