我有一篇包含大量文章的博客,我想知道如何构建一个可以检测每篇文章图像主色的函数,并且每篇文章都以主色设置背景。
(我正在使用Django +1.8和Python 3.4.x)
我试图从头开始构建它,步骤是什么?
颜色检测功能应该是什么样的?
任何想法/建议?
答案 0 :(得分:3)
是的,我只想要一个关于它如何在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提供ImageField
继承自FileField
的{{1}},它提供.open()
方法,这是我们上面用来获取图像文件的句柄(将传递给我们的scipy / PIL代码)
...构建一个可以检测每篇文章图像主色的函数,并为每篇文章设置主色的背景。
要在我们可以做的所有文章上运行此操作:
for article_image in ArticleImage.objects.all():
article_image.set_article_background_color()
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}}
e.g。如果要覆盖通用style.css
,可以在HTML中定义<style></style>
块
<style>
body {
background: #{{article.background_color}};
}
</style>
(举个例子,你也可以让django生成一个/css/style-custom.css
文件,包含在主/css/style.css
之后