动态创建图像缩略图(使用Django)
-
21-09-2019 - |
题
我想根据URL中的参数动态创建缩略图。例如, http://mysite.com/images/1234/120x45.jpg
会创建一个 120x45
图像ID的缩略图 1234
.
明显的解决方案是具有Django视图,该视图可以执行以下操作:
- 在此尺寸下查找图像的先前缓存版本。
- 如果没有缓存,则创建一个缩略图(一些用于锁定的逻辑,以便只有1个进程创建缩略图和其他进程等待)。
- 通过Django将结果管输送。
那应该“工作”,但我担心性能。我不喜欢使用Django提供静态内容的想法。解决这个问题的其他方法还有哪些方法?
解决方案
您不必使用Django直接提供静态内容。只需将您的服务器路由404请求您的Images文件夹到Django视图,然后将文件名分开并生成适当的缩略图,然后再将其重定向到原始URL(希望它将不再是404)。
至于另一个答案的django-imagekit建议,我不确定它是否可以让您 动态 基于URL生成图像拇指,但我当然建议将其用于所有功能。
编辑:
至于实际的URL结构,我感到更典型 /images/filename-120x45.jpg
将使您更轻松地滤除与动态缩略图生成无关的404个请求。例如,说有很多404个错误 /images/original_size_image.jpg
. 。您不希望那些被路由到Django的人,并且只能将该格式的文件名与Regex匹配。 结束编辑
您必须小心,让任何人都知道此功能垃圾邮件您的Django应用程序。他们可能会以无限数量的图像大小和触手可及的文件名组合杀死它。您将需要弄清楚如何在这些请求上放大上限,例如,如果任何一个维度都比原始尺寸大,甚至弄清楚如何限制了如何对同一图像的多个维度限定请求。也许这就是您在提到“锁定”时所得到的。
顺便说一句,我看到您已经标记为Apache,但我真的想建议您通过类似的内容提供静态内容 nginx. 。如果您使用在服务静态文件时不完全废话的静态文件服务器,则可能会否定动态图像请求的额外开销。
其他提示
请参阅此应用程序以产生大拇指。
使用Tornadoweb服务器在Python开发。
https://github.com/globocom/thumbor
pip install thumbor
出色的应用
查看Django ImageKit。http://bitbucket.org/jdriscoll/django-imagekit/wiki/home
我查找了这些答案,即使它们工作的工作对我来说太高了。如果您只想快速而肮脏的方法来获取缩略图,则仅使用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图书馆 这里
欢呼,希望这对某人有帮助。
你可以窥视 Sorl-Thumbnail文档. 。我在我的几乎所有项目中都使用它,以及从 /media/
dir :)
查看此讨论页面有关Django的缩略图贡献:
我遇到了同样的问题:在高流量站点中,在响应时间生成数十个缩略图是不可行的,就像生成批处理所有过去内容的缩略图一样,因此我为此创建了一个应用程序。一探究竟: https://github.com/hcarvalhoalves/django-rest-thumbnails
拇指师确实是一项出色的服务,您可以在Django上使用Django-Thumbor。
pip install django-thumbor
您可能只需根据需要根据所需的指定维度调整显示的图像大小。这 Django ImageFit 图书馆确实做到了这一点,并且还提供了作物的可能性。
在您的示例中,您会写 {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }}
您将以120x45尺寸的图像结束。