2010-06-11 28 views
0

我一直在使用這個小片段來選擇隨機圖像。不過,我想改變它只選擇一定大小的圖像。檢查圖像大小時遇到​​問題。如果我使用get_image_dimensions(),我需要使用條件語句,這就要求我允許有例外。所以,我想我需要一些關於圖片尺寸限制的指針。謝謝。如何使用Django/Python選擇特定大小的隨機圖像?

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

好,更直接的方式來獲得圖像尺寸是使用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/)。或者,如果這將是一項常見任務,只需將圖像放入按維度預先排序的文件夾中即可。

+0

所以當我實現這個改變時,我得到了語法錯誤'lambda不能包含賦值。' 另外,請問是真的從不同的東西像這樣: 文件名= [F爲F IN os.listdir(FULLPATH)如果is_image_file(f)和get_image_dimensions(F)= my_dimensions] – Jonathan 2010-06-13 18:09:33

+0

衛生署!應該是: filenames = filter(lambda f:is_image_file(f)和img_dimensions(f)== my_dimensions,os.listdir(fullpath))。 用雙等號代替比較而不是賦值。 至於你的第二個問題,它只是風格 - 我不喜歡長列表解析。 – gilesc 2010-06-13 21:15:54

相關問題