Как выбрать случайное изображение определенного размера, используя Django / Python? - PullRequest
0 голосов
/ 12 июня 2010

Я использовал этот маленький фрагмент для выбора случайных изображений.Однако я хотел бы изменить его, чтобы выбрать только изображения определенного размера.У меня проблемы с проверкой размера изображения.Если я использую 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 Ответ

1 голос
/ 12 июня 2010

Что ж, более прямым способом получения размеров изображения является использование библиотеки изображений 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/). или, если это будет обычной задачей, просто поместите изображения в папки предварительно заказано по размерам.

...