Общий алгоритм может быть следующим:
- найти средний цвет вашего изображения
найти комплиментарный или контрастный цвет
установить цвет text_input на контрастный цвет.
Реализация 1 и 2 может быть довольно сложной.В этом примере я покажу только грубый набросок.Конечно, вы можете найти или реализовать более эффективные функции.
- найти доминирующий цвет изображения:
from PIL import Image as I
def average_color(image_fn):
im = I.open(image_fn)
im = im.convert('RGB')
#comment the above if you don't use images with opacity
new_im = im.resize((1, 1))
pixels = new_im.getpixel((0, 0))
print pixels
return pixels
Это очень-очень грубый способ.Я предположил, что изображение имеет квадратную форму.Затем, используя PIL, я просто изменяю его размер на 1 пиксель (1x1), затем я получаю RGB-цвет этого пикселя.
найти комплиментарный / контрастный цвет.
from colorsys import rgb_to_hls as rgb2hls
from colorsys import hls_to_rgb as hls2rgb
def contrast(rgb):
h,l,s = rgb2hls(*rgb)
new_l = 0 if l>=0.5 else 1
new_rgb = hls2rgb(h, new_l,s)
return new_rgb
Эта функция получает пиксель RGB, затем переводит его в HLS, затем устанавливает яркость на 0 или 1 (насколько это возможно от текущегозначение), затем переводит его обратно в RGB и возвращает это значение.Таким образом, мы получаем белый или черный цвет текста, в зависимости от того, какой из них более контрастен с текущим изображением.
Теперь давайте добавим эти алгоритмы в приложение kivy:
from __future__ import division
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.image import Image
from kivy.core.window import Window
from PIL import Image as I
from colorsys import rgb_to_hls as rgb2hls
from colorsys import hls_to_rgb as hls2rgb
KV = """
FloatLayout
MyImage
id: image
text_input:text_input
#source: 'im.png'
MyTextInput
id: text_input
<MyTextInput@TextInput>
font_size: 40
background_normal : ''
background_active: ''
background_color: 0,0,0,0
text: 'this is some text. Drag and drop an image here. '*20
"""
def average_color(image_fn):
im = I.open(image_fn)
im = im.convert('RGB')
#comment the above if you don't use images with opacity
new_im = im.resize((1, 1))
pixels = new_im.getpixel((0, 0))
print pixels
return pixels
def contrast(rgb):
h,l,s = rgb2hls(*rgb)
new_l = 0 if l>=0.5 else 1
new_rgb = hls2rgb(h, new_l,s)
return new_rgb
class MyImage(Image):
def on_source(self, inst, fn):
aver = [i/255 for i in average_color(fn)]
contrast_rgba = [i for i in contrast(aver)]+[1]
self.text_input.foreground_color = contrast_rgba
class MyApp(App):
def build(self):
self.root = Builder.load_string(KV)
Window.bind(on_dropfile=self.manage_dropfile)
def is_image(self, fn):
if fn[-4:] in ['.png', '.jpg', 'jpeg']: return True
return False
def manage_dropfile(self, window, fn):
fn = fn.decode('UTF-8')
if self.is_image(fn):
self.root.ids.image.source = fn
MyApp().run()
Самое важноеявляется то, что мы создали класс MyImage, в котором в методе on_source () (при каждом изменении источника изображения) мы получаем среднее значение цвета, затем контрастный цвет и, наконец, мы меняем foreground_color.
Также я реализовалдрагдроп изображений.Вы можете удалить любой файл изображения jpg / png из какой-либо папки на вашем компьютере, и текст автоматически изменит свой цвет на черный или белый.![enter image description here](https://i.stack.imgur.com/CrqCj.jpg)