Django 检测图像的主色

Django detect dominant color of an image

我的博客有很多文章,我想知道如何构建一个函数来检测每篇文章图像的主色,并为每篇文章设置主色背景。

(我正在使用 Django +1.8 和 Python 3.4.x)

我正在尝试从头开始构建它,步骤是什么?

颜色检测函数应该是什么样的?

任何 thoughts/suggestions?

Yeah I just wanted a schema of how it would work on django

让我们假设一个类似于下面的骨架

class Article(Model):
    background_color = CharField(max_length=6) # hex code of color

class AricleImage(Model):
    article = ForeignKey(Article)
    image = ImageField()

    def get_dominant_color(self):
         return _get_dominant_color(self.image.open())
         # or pass self.image.file, depending on your storage backend
         # We'll implement _get_dominant_color() below later

    def set_article_background_color(self):
         self.article.background_color = self.get_dominant_color()

Django 提供了一个继承自 FileFieldImageField,它提供了一个 .open() 方法,这就是我们上面用来获取图像文件句柄的方法(将传递给我们下面的 scipy/PIL 代码)

...to build a function that can detect the dominant color of each article image and for each article set the background with the dominant color.

为了 运行 我们可以在所有文章上做到这一点:

for article_image in ArticleImage.objects.all():
    article_image.set_article_background_color() 

让我们改编 this answer 中的代码并从中创建一个函数:

import struct                                                               
import Image                                                                
import scipy                                                                
import scipy.misc                                                           
import scipy.cluster                                                        

NUM_CLUSTERS = 5                                                            

def _get_dominant_color(image_file):                                       
    """                                                                     
    Take a file object and return the colour in hex code       
    """                                                                     

    im = image_file                                            
    im = im.resize((150, 150))      # optional, to reduce time              
    ar = scipy.misc.fromimage(im)                                           
    shape = ar.shape                                                        
    ar = ar.reshape(scipy.product(shape[:2]), shape[2])                     

    print 'finding clusters'                                                
    codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)                 
    print 'cluster centres:\n', codes                                       

    vecs, dist = scipy.cluster.vq.vq(ar, codes)         # assign codes      
    counts, bins = scipy.histogram(vecs, len(codes))    # count occurrences 

    index_max = scipy.argmax(counts)                    # find most frequent
    peak = codes[index_max]                                                 
    colour = ''.join(chr(c) for c in peak).encode('hex')                    
    return colour                                          

在模板中设置文章背景

最后但同样重要的是,当您呈现文章时,只需使用 {{article.background_color}}

例如如果你想覆盖通用 style.css 你可以在 HTML

中定义一个 <style></style>
<style>
body {
    background: #{{article.background_color}};
}
</style>

(举个例子,你也可以让django生成一个/css/style-custom.css文件包含在你的主/css/style.css之后)