【问题标题】:How to select random image of specific size using Django / Python?如何使用 Django / Python 选择特定大小的随机图像?
【发布时间】:2010-06-11 21:09:42
【问题描述】:

我一直在使用这个小 sn-p 来选择随机图像。但是我想将其更改为仅选择特定尺寸的图像。我在检查图像大小时遇到​​了麻烦。如果我使用 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)

【问题讨论】:

    标签: python django image size limit


    【解决方案1】:

    嗯,获取图像尺寸的一种更直接的方法是使用 Python 图像库(无论如何,这是 Django 在后端用于 get_image_dimensions 的方法)。

    所以,你可以像这样使用它:

    >> 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))
    

    my_dimensions 在哪里——你的尺寸。

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

    【讨论】:

    • 因此,当我实施该更改时,我收到语法错误“lambda 不能包含赋值”。此外,这与以下内容有何不同:filenames = [f for f in os.listdir(fullpath) if is_image_file(f) and get_image_dimensions(f)=my_dimensions]
    • 噢!应该是:filenames = filter(lambda f: is_image_file(f) and img_dimensions(f)==my_dimensions, os.listdir(fullpath))。使用双等号进行比较而不是赋值。至于你的第二个问题,它只是风格——我不喜欢长列表理解。
    猜你喜欢
    • 2020-07-03
    • 2018-09-02
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2019-03-30
    相关资源
    最近更新 更多