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

如何使用django/python选择特定大小的随机图像?

  •  0
  • Jonathan  · 技术社区  · 16 年前

    我一直在使用这个小片段来选择随机图像。不过,我想将其更改为仅选择特定大小的图像。我在检查图像尺寸时遇到了麻烦。如果我使用get_image_dimensions(),我需要使用一个条件语句,它要求我允许异常。所以,我想我需要一些关于图像尺寸限制的指针。谢谢。

    import os
    import random
    import posixpath
    from django import template
    from django.conf import settings
    
    register = template.Library()
    
    def is_image_file(filename):
        """Does `filename` appear to be an image file?"""
        img_types = [".jpg", ".jpeg", ".png", ".gif"]
        ext = os.path.splitext(filename)[1]
        return ext in img_types
    
    @register.simple_tag
    def random_image(path):
        """
        Select a random image file from the provided directory
        and return its href. `path` should be relative to MEDIA_ROOT.
    
        Usage:  <img src='{% random_image "images/whatever/" %}'>
        """
        fullpath = os.path.join(settings.MEDIA_ROOT, path)
        filenames = [f for f in os.listdir(fullpath) if is_image_file(f)]
        pick = random.choice(filenames)
        return posixpath.join(settings.MEDIA_URL, path, pick)
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   gilesc    16 年前

    好吧,一个更直接的获取图像尺寸的方法是使用python图像库(这也是Django在后端使用get_image_尺寸的方法)。

    所以,你使用它就像:

    >> import Image
    >> img = Image.open("foo.png")
    >> img.size
    (1729,828)
    

    最简单的解决方案是:

    img_dimensions = lambda f: Image.open(f).size
    filenames = filter(lambda f: is_image_file(f) and img_dimensions(f)==my_dimensions, os.listdir(fullpath))
    

    我的尺寸在哪里——你的尺寸。

    问题是,这(以及任何其他检查文件尺寸的方法)实际上每次都必须打开和读取图像,这是不明智的重复操作。因此,根据应用程序的负载,您可能希望将img_dimensions()放入一个实际的、独立的函数中,并将其内存化。( http://code.activestate.com/recipes/52201-memoizing-cacheing-function-return-values/ )或者,如果这是一项常见的任务,只需将图像放入按维度预先排序的文件夹中即可。