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 提供了一个继承自 FileField
的 ImageField
,它提供了一个 .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
之后)
我的博客有很多文章,我想知道如何构建一个函数来检测每篇文章图像的主色,并为每篇文章设置主色背景。
(我正在使用 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 提供了一个继承自 FileField
的 ImageField
,它提供了一个 .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
之后)