105 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import multiprocessing
 | |
| import cv2
 | |
| import pathlib
 | |
| import numpy
 | |
| from kivy.app import App
 | |
| from kivy.uix.label import Label
 | |
| from kivy.uix.image import Image
 | |
| from kivy.uix.behaviors.button import ButtonBehavior
 | |
| from kivy.uix.boxlayout import BoxLayout
 | |
| from kivy.uix.gridlayout import GridLayout
 | |
| from kivy.graphics.texture import Texture
 | |
| 
 | |
| bg = numpy.array([27, 27, 27])
 | |
| 
 | |
| colors = [
 | |
|     (numpy.array([213, 182,  93]), numpy.array([255, 255, 255])),
 | |
|     (numpy.array([ 78, 189, 207]), numpy.array([255, 255, 255])),
 | |
|     (numpy.array([ 83, 131,  63]), numpy.array([255, 255, 255])),
 | |
|     (numpy.array([203,  76,  62]), numpy.array([255, 255, 255]))
 | |
| ]
 | |
| 
 | |
| raw_dir = pathlib.Path('raw')
 | |
| icons_dir = pathlib.Path('icons')
 | |
| 
 | |
| 
 | |
| def make_img(img, c):
 | |
|     rc = c[0]
 | |
|     gc = c[1]
 | |
|     for row in img:
 | |
|         for i in range(len(row)):
 | |
|             pix = row[i]
 | |
|             rv = pix[0] / 255
 | |
|             gv = pix[1] / 255
 | |
|             row[i] = rv * rc + gv * gc + (1 - rv - gv) * bg
 | |
| 
 | |
|     return cv2.flip(img, 0)
 | |
| 
 | |
| 
 | |
| class Im(ButtonBehavior, Image):
 | |
|     def __init__(self, color):
 | |
|         ButtonBehavior.__init__(self)
 | |
|         Image.__init__(self, size=(256, 256), size_hint=(256, 256))
 | |
|         self.name = None
 | |
|         self.mc = color
 | |
| 
 | |
|     def update(self, img, name):
 | |
|         self.name = name
 | |
|         tex: Texture = Texture.create(size=(img.shape[1], img.shape[0]), colorfmt='rgb')
 | |
|         tex.blit_buffer(img.tobytes(), colorfmt='rgb', bufferfmt='ubyte')
 | |
|         self.texture = tex
 | |
| 
 | |
|     def on_press(self):
 | |
|         self.texture.save(f'icons/{self.name}')
 | |
|         app.update()
 | |
| 
 | |
| 
 | |
| class MainApp(App):
 | |
|     def build(self):
 | |
|         self.imgs = pathlib.Path('raw').glob('*.png')
 | |
|         self.img: pathlib.Path = None
 | |
|         self.label = Label(font_size=48)
 | |
|         self.im = [Im(c) for c in colors]
 | |
|         self.pool = multiprocessing.Pool(4)
 | |
|         gl = GridLayout(cols=2)
 | |
|         for i in self.im:
 | |
|             gl.add_widget(i)
 | |
|         bl = BoxLayout(orientation='vertical')
 | |
|         bl.add_widget(self.label)
 | |
|         bl.add_widget(gl)
 | |
|         self.update()
 | |
|         return bl
 | |
| 
 | |
|     def update(self):
 | |
|         self.img: pathlib.Path = next(self.imgs)
 | |
|         if self.img is None:
 | |
|             exit(0)
 | |
| 
 | |
|         if (icons_dir / self.img.name).exists():
 | |
|             self.update()
 | |
|             return
 | |
| 
 | |
|         self.label.text = str(self.img.name)[:-4]
 | |
| 
 | |
|         i = cv2.imread(str(self.img))
 | |
|         i = cv2.cvtColor(i, cv2.COLOR_BGR2RGB)
 | |
| 
 | |
|         print('updating')
 | |
|         imgs = self.pool.starmap(make_img, [
 | |
|             (i, colors[0]),
 | |
|             (i, colors[1]),
 | |
|             (i, colors[2]),
 | |
|             (i, colors[3])
 | |
|         ])
 | |
| 
 | |
|         for j in range(4):
 | |
|             self.im[j].update(imgs[j], self.img.name)
 | |
| 
 | |
| 
 | |
| app = MainApp()
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     icons_dir.mkdir(exist_ok=True)
 | |
|     app.run()
 | |
| 
 |