动态创建图像缩略图(使用 django)
Posted
技术标签:
【中文标题】动态创建图像缩略图(使用 django)【英文标题】:Dynamically create image thumbnails (using django) 【发布时间】:2011-01-07 13:39:54 【问题描述】:我想根据 URL 中的参数动态创建缩略图。例如,http://mysite.com/images/1234/120x45.jpg
将为图像 ID 1234
创建一个 120x45
缩略图。
对此的明显解决方案是拥有一个执行以下操作的 django 视图:
-
查找此大小的图像以前缓存的版本。
如果缩略图未缓存,则创建缩略图(一些用于锁定的逻辑,以便只有 1 个进程创建缩略图,其他进程等待)。
通过 django 管道传输结果。
这应该“有效”,但我担心性能。我不喜欢使用 django 提供静态内容的想法。还有什么其他方法可以解决这个问题?
【问题讨论】:
如果您是动态创建缩略图,那么它并不是真正的静态,是吗? 我认为它是一个延迟加载的静态缩略图。创建完成后,我希望获得与静态相同的性能。 【参考方案1】:查看 django imagekit。 http://bitbucket.org/jdriscoll/django-imagekit/wiki/Home
【讨论】:
【参考方案2】:你也可以试试sorl,Satchmo正在使用。
【讨论】:
【参考方案3】:您不必使用 Django 直接提供静态内容。只需让您的服务器将您的图像文件夹的 404 请求路由到 Django 视图,它会在其中拆分文件名并生成适当的缩略图,然后再重定向回原始 URL(希望不再是 404)。
至于其他答案的 django-imagekit 建议,我不确定它是否可以让您动态根据 URL 生成图像缩略图,但我当然建议将它用于所有功能确实有。
编辑:
至于实际的URL结构,我觉得比较典型的/images/filename-120x45.jpg
可以让你更容易过滤掉与动态缩略图生成无关的404请求。例如,假设/images/original_size_image.jpg
存在大量 404 错误。您不希望那些被路由到 Django,并且您只能将该格式的文件名与正则表达式匹配。 [结束编辑]
您必须小心不要让任何知道此功能的人向您的 Django 应用程序发送垃圾邮件。他们可能会通过触手可及的无限数量的图像大小和文件名组合来杀死它。您需要弄清楚如何对这些请求设置上限,例如,如果任一维度大于原始维度,则重定向回 404,或者甚至弄清楚如何限制对同一图像的多个维度的请求。不过,也许这就是您在提到“锁定”时的意思。
顺便说一句,我看到您已标记 Apache,但我真的很想建议您通过 nginx 之类的方式提供静态内容。如果您使用的静态文件服务器在提供静态文件方面并不完全废话,那么您可能会抵消动态图像请求的额外开销。
【讨论】:
很好的答案。垃圾邮件问题的一种解决方案是预先定义允许的图像/缩略图大小列表。另外,我同意nginx。我目前正在使用 nginx 提供静态内容,并将在此问题中添加 nginx 标签。 啊,是的……但我不确定预定义的允许大小列表对您来说有多“动态”,所以我没有提及。我也不确定您的图像格式以及它们是否一致或标准比例,或者您是否计划裁剪拇指,如果它不适合预定义的尺寸等,等等。另外,我将立即编辑我的答案添加有关您讨论的 URL 格式的内容。 我为此使用了瓶子,但它使用相同的原理工作。以这种方式工作真是太酷了。【参考方案4】:您可以查看the sorl-thumbnail documentation。我在几乎所有项目中都使用它,并使用来自 /media/
目录的 Nginx 提供静态内容:)
【讨论】:
【参考方案5】:我查找了这些答案,即使它们有效,但对我来说还是太复杂了。 如果您只是想要一种快速而肮脏的方式来获取缩略图,那么使用 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】:查看这个关于 Django 缩略图贡献的讨论页面:
https://code.djangoproject.com/wiki/ThumbNails
【讨论】:
只包含链接的答案是considered bad practice。请在此处总结内容(请勿复制/粘贴),以便答案可以独立存在。如果您不这样做,您的答案将面临被删除的风险,尤其是在链接失效的情况下。【参考方案7】:查看此应用程序以生成拇指。
用 Python 开发,使用 tornadoweb 服务器。
https://github.com/globocom/thumbor
pip install thumbor
很好的应用
【讨论】:
Thumbor 确实做到了 OP 想要的一切。【参考方案8】:我遇到了同样的问题:在一个高流量的网站中,在响应时生成几十个缩略图是不可行的,因为为所有过去的内容批量生成缩略图也是不可行的,所以我为此创建了一个应用程序。看看:https://github.com/hcarvalhoalves/django-rest-thumbnails
【讨论】:
【参考方案9】:Thumbor 确实是一个很棒的服务,你可以在 django 上使用 django-thumbor。
pip install django-thumbor
在这里回购: https://github.com/ricobl/django-thumbor
【讨论】:
【参考方案10】:您可能只需要根据您需要的指定尺寸,按需调整显示图像的大小。 Django Imagefit 库正是这样做的,它还提供了裁剪的可能性。
在您的示例中,您将编写 'http://example.com/images/1234.jpg'|resize:'120x45'
,并以 120x45 大小的图像结束。
【讨论】:
以上是关于动态创建图像缩略图(使用 django)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用在 jython 上运行的 django 创建图像缩略图?