如何使用sorl-thumbnail调整源大小?

use*_*384 9 django thumbnails image-resizing sorl-thumbnail

我正在网上搜索我的问题,但无论如何也找不到明确的答案者.

基本上,我想使用sorl并希望在模型保存时间内调整源图像的大小以将其大小调整为640x480大小,这样我就不会最终在磁盘上存储用户原始的2.5 MB文件.然后我将使用templatetags从我的源代码中创建常规缩略图,如sorl中所述.

我遇到了几个来源引用使用的ThumbnailField模型字段应该在sorl.thumbnail.fields中可用.请点击此处链接.但是,在我从主干中获取最新的sorl副本时,我看不到任何ThumbnailField或ImageWithThumbnailsField.我在模型中导入它的尝试失败了.我看到这些参考文献虽然陈旧但想知道我是否可以用最新的sorl实现相同的目标.

另一方面,sorl文档仅指示来自sorl.thumbnail(参见此处)的ImageField ,它没有任何大小参数来控制源大小调整.

顺便说一下,我看到easy_thumbnail提供了这个功能,它带有一个输入参数source_resize.

任何帮助将不胜感激!

摘要

我接受了下面的答案,但我觉得对这个用例的自然索引支持非常有用 - 即将resize_source参数添加到sorl的ImageField以允许调整源图像的大小.以下是为什么它在该领域有用的两个因素:

  1. 如果您的应用程序不需要它,则不要存储用户的巨大原始图像.节省磁盘空间.

  2. 如果您没有特定的极高质量原因,请不要花费额外的CPU来重新调整来自巨大源图像的缩略图.为了避免这种情况,可以将模板中的嵌套标签写入较小尺寸图像的缩略图中,但它很快就会变得烦人.

hgr*_*und 12

我在上面的代码中发现了一个缺陷,如果有人想使用它,那么"str has no method chunck()".这是我的修复:

    from sorl.thumbnail import get_thumbnail
    from django.core.files.base import ContentFile

 class Foo(models.Model):
    image = models.ImageField(upload_to...)


    def save(self, *args, **kwargs):
        if not self.id:  
            super(Foo, self).save(*args, **kwargs)  
            resized = get_thumbnail(self.image, "100x100" ...)
            self.image.save(resized.name, ContentFile(resized.read()), True)
        super(Foo, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)


Tim*_*ony 7

ImageField您提到的Sorl 是一个普通的Django ImageField,它具有管理缓存缩略图删除的额外好处.初始上传没有进行大小调整 - 您必须通过用于上传的视图手动实现.文档展示了如何解决这个问题.您可以使用SORL 该视图来完成实际大小操作本身,使用低级别API examlpes

编辑

更快的替代方法是在使用sorl保存模型时调整图像大小.您可以执行以下操作(完全未经测试!)

from sorl.thumbnail import get_thumbnail

class Foo(models.Model):
    image = models.ImageField(upload_to...)

    def save(self, *args, **kwargs):
        if not self.id:
            # Have to save the image (and imagefield) first
            super(Foo, self).save(*args, **kwargs)
            # obj is being created for the first time - resize
            resized = get_thumbnail(self.image, "100x100" ...)
            # Manually reassign the resized image to the image field
            self.image.save(resized.name, resized.read(), True)
        super(Foo, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

这意味着您将在磁盘上拥有相同图像的2个版本 - 一个是django图像字段决定保存它(upload_to路径),另一个是sorl缩略图已保存它的已调整大小的缩略图.这与图像上传和保存两次的事实一起,是这种方法的缺点.但实施起来更快