Я создал сайт с кучей изображений, используя django (3.0) python (3.8). Я пытаюсь создать фильтр, в котором пользователь выбирает цвет и возвращает изображения, доминирующий цвет которых является цветом, запрошенным пользователем. Для этого
- используйте цветовую диаграмму (pip install colorgram.py), чтобы извлечь два доминирующих цвета (кроме слишком белых) и сохранить их в поле «dominant_color» при сохранении экземпляра.
def RgbToInt(rgb):
red = rgb[0]
green = rgb[1]
blue = rgb[2]
RGBint = (red << 16) + (green << 8) + blue
return RGBint
class Design(models.Model):
...fields...
image = ImageField(upload_to=upload_image_path)
dominant_color = models.CharField(max_length=80, blank=True)
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
img = Image.open(self.image.path).resize((180, 180))
colors = colorgram.extract(img, 3)
white = 210
color = [f'{RgbToInt(c.rgb)},{int(round(c.proportion * 100, 0))}' for c in colors
if not (c.rgb[0] > white and c.rgb[1] > white and c.rgb[2] > white)]
if len(color) > 3: color = color[:2]
self.dominant_color = color
super(Design, self).save(force_insert=False, force_update=False, using=None,
update_fields=None)
- Colorgram дает результат, как показано ниже:
[<colorgram.py Color: Rgb(r=252, g=251, b=249), 72.43592003666748%>,
<colorgram.py Color: Rgb(r=196, g=170, b=103), 18.46067059196841%>,
<colorgram.py Color: Rgb(r=194, g=150, b=37), 9.103409371364101%>]
- Я сохраняю его как строку в модели Design, как показано ниже:
['12888679,18', '12752421,9']
получить аргумент запроса цвета из запроса и провести сравнение в представлении. и вот та часть, в которой я полностью потерялся.
... view...
def get_queryset(self):
qs = super().get_queryset()
color = self.request.GET.get('color')
if color:
...GOTTA FIND IMAGES WITH DOMINANT COLOR SIMILAR TO REQUESTED COLOR...
return qs
- Я искал deltaE, но, насколько я понимаю, он сравнивает два изображения, а не два значения цвета. Спасибо за чтение и помощь.