代码之家  ›  专栏  ›  技术社区  ›  Gattster

动态创建图像缩略图(使用django)

  •  8
  • Gattster  · 技术社区  · 15 年前

    我想基于URL中的参数动态创建缩略图。例如, http://mysite.com/images/1234/120x45.jpg 将创建一个 120x45 图像ID的缩略图 1234 .

    解决这一问题的明显方法是使用Django视图,该视图执行以下操作:

    1. 查找此大小的图像以前缓存的版本。
    2. 如果未缓存缩略图,则创建缩略图(某些锁定逻辑使只有1个进程创建缩略图,其他进程等待)。
    3. 通过管道将结果传送到Django。

    这应该“有效”,但我关心的是性能。我不喜欢用django服务静态内容的想法。完成这个问题的其他方法是什么?

    10 回复  |  直到 7 年前
        1
  •  8
  •   user136565    15 年前

    您不必使用django直接为静态内容提供服务。只需让服务器将404请求路由到Django视图,在该视图中,服务器将文件名拆分并生成适当的缩略图,然后再重定向回原始URL(希望不再是404)。

    至于另一个答案的Django Imagekit建议,我不确定它是否能让您 动态地 基于URL生成图像缩略图,但我确实建议将其用于它所具有的所有功能。

    编辑:

    至于实际的URL结构,我觉得比较典型 /images/filename-120x45.jpg 将允许您更容易筛选出404个与动态缩略图生成无关的请求。例如,假设有大量404个错误 /images/original_size_image.jpg . 您不希望将这些文件路由到django,并且只能将该格式的文件名与regex匹配。 [结束编辑]

    但是你必须小心让任何人知道这个功能,垃圾邮件你的django应用程序。他们可能会用指尖无限多的图像大小和文件名组合来杀死它。您需要考虑如何对这些请求设置上限,例如,如果任一维度大于原始维度,则重定向回404,或者甚至考虑如何为同一图像的多个维度设置请求上限。也许这就是你提到“锁定”时的想法。

    顺便说一句,我看到您已经标记了Apache,但我真的想建议您通过类似 Nginx .如果您使用的静态文件服务器在提供静态文件方面不完全是废话,那么您可能会消除动态图像请求的额外开销。

        2
  •  5
  •   rodrigo-silveira selftaught91    12 年前

    你也可以试试 sorl ,它正在被使用 Satchmo .

        3
  •  4
  •   programming code Cícero Verneck Corrêa    11 年前

    请参阅此应用程序以生成拇指。

    使用TornadoWeb服务器在python中开发。

    https://github.com/globocom/thumbor

    pip install thumbor
    

    很好的应用

        4
  •  2
  •   ablerman    15 年前
        5
  •  2
  •   avlnx    13 年前

    我查了一下这些答案,尽管它们很有用,但它们对我来说还是太抽象了。 如果你只是想要一个快速而肮脏的方法来获取缩略图,那么使用PIL库可能是一个很好的选择,这是我的代码:

    file, ext = os.path.splitext('image.jpg')
    im = Image.open('/full/path/to/image.jpg')
    im.thumbnail(size, Image.ANTIALIAS)
    thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg")
    im.save(thumb_path)
    

    下载PIL库 here

    干杯,希望这能帮助别人。

        6
  •  2
  •   Ry- Vincenzo Alcamo    12 年前

    你可以看一眼 the sorl-thumbnail documentation . 我在几乎所有的项目中都使用它,并从 /media/ 迪尔:)

        7
  •  0
  •   BigJ    13 年前

    查看有关Django缩略图贡献的讨论页面:

    https://code.djangoproject.com/wiki/ThumbNails

        8
  •  0
  •   hcalves    12 年前

    我也遇到了同样的问题:在一个流量很大的站点中,在响应时间生成几十个缩略图是不可行的,因为批量生成过去所有内容的缩略图也是可行的,所以我为此创建了一个应用程序。过来看: https://github.com/hcarvalhoalves/django-rest-thumbnails

        9
  •  0
  •   ricobl    12 年前

    大拇指确实是一个很好的服务,你可以用大拇指在大拇指上。

    pip install django-thumbor
    

    回购协议: https://github.com/ricobl/django-thumbor

        10
  •  0
  •   vinyll    7 年前

    您可能只需要根据所需的指定尺寸,按需调整显示图像的大小。 这个 Django Imagefit 图书馆正是这样做的,它也提供了裁剪的可能性。

    在你的例子中,你会写 {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} 最后是120x45大小的图像。