File size: 3,494 Bytes
5a74a7f
 
 
 
 
 
 
 
 
 
6172439
5a74a7f
 
 
 
 
6172439
 
 
 
 
 
 
 
 
5a74a7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6172439
 
 
 
 
 
 
 
 
 
 
 
 
 
5a74a7f
 
 
 
 
 
6172439
5a74a7f
 
6172439
5a74a7f
 
 
 
 
 
 
 
 
6172439
5a74a7f
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
'''Pyxelate Demo

- Based on https://huggingface.co/spaces/akhaliq/Pyxelate
- Credits to akhaliq

2021-12-16 first created for testing
'''

import os
from glob import glob
from loguru import logger

import gradio as gr
from skimage import io as sio
from pyxelate import Pyx, Pal


# ----------- Settings -----------
examples = sorted(glob(os.path.join('examples', '*.jpg')))

# ----------- Logging -----------
logger.add('app.log', mode='a')
logger.info('===== APP RESTARTED =====')

# ----------- Params -----------
DOWNSAMPLE_MIN = 1
DOWNSAMPLE_MAX = 10
COLOR_MIN = 1
COLOR_MAX = 20
PALETTE_CHOICES = [
    'none', # if not chosen
    'TELETEXT', 'BBC_MICRO', 'CGA_MODE4_PAL1', 'CGA_MODE5_PAL1', 
    'CGA_MODE4_PAL2', 'ZX_SPECTRUM', 'APPLE_II_LO', 'APPLE_II_HI', 
    'COMMODORE_64', 'GAMEBOY_COMBO_UP', 'GAMEBOY_COMBO_DOWN', 'GAMEBOY_COMBO_LEFT', 
    'GAMEBOY_COMBO_RIGHT', 'GAMEBOY_A_UP', 'GAMEBOY_A_DOWN', 'GAMEBOY_A_LEFT', 
    'GAMEBOY_A_RIGHT', 'GAMEBOY_B_UP', 'GAMEBOY_B_DOWN', 'GAMEBOY_B_LEFT', 
    'GAMEBOY_B_RIGHT', 'GAMEBOY_ORIGINAL', 'GAMEBOY_POCKET', 'GAMEBOY_VIRTUALBOY', 
    'MICROSOFT_WINDOWS_16', 'MICROSOFT_WINDOWS_20', 'MICROSOFT_WINDOWS_PAINT', 
    'PICO_8', 'MSX', 'MONO_OBRADINN_IBM', 'MONO_OBRADINN_MAC', 'MONO_BJG', 'MONO_BW', 
    'MONO_PHOSPHOR_AMBER', 'MONO_PHOSPHOR_LTAMBER', 'MONO_PHOSPHOR_GREEN1', 
    'MONO_PHOSPHOR_GREEN2', 'MONO_PHOSPHOR_GREEN3', 'MONO_PHOSPHOR_APPLE', 'APPLE_II_MONO', 
    'MONO_PHOSPHOR_APPLEC', 'APPLE_II_MONOC'
]
DITHER_CHOICES = ['none', 'naive', 'bayer', 'floyd', 'atkinson']


def predict(image_obj, sampling_param, color_param, palette_param, dither_param):
    img = sio.imread(image_obj.name)
    logger.info('--- image loaded')

    if palette_param != 'none':
        color_param = 'none'
        palette = Pal[palette_param]
    else:
        palette = color_param

    pyx = Pyx(factor=sampling_param, palette=palette, dither=dither_param)
    pyx.fit(img)
    img_out = pyx.transform(img)
    logger.info('--- output generated')
    return img_out

iface = gr.Interface(
    predict,
    title='์ด๋ฏธ์ง€๋ฅผ ํ”ฝ์…€ํ™” ์‹œํ‚ค๋Š” ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค.',
    description='์ด๋ฏธ์ง€๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด๋ฏธ์ง€๋ฅผ ์Šค์ผ€์ผ๋งํ•˜๊ณ  ์ƒ‰๊ฐ์„ ๋ฐ”๊พธ์–ด ํ”ฝ์…€ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.',
    inputs=[
        gr.inputs.Image(label='์ธํ’‹ ์ด๋ฏธ์ง€๋ฅผ ์ค€๋น„ํ•ด์ฃผ์„ธ์š”', type='file'),
        gr.inputs.Slider(label='๋‹ค์šด์ƒ˜ํ”Œํ•  ํฌ๊ธฐ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” (ํด์ˆ˜๋ก ํ”ฝ์…€ํฌ๊ธฐ๊ฐ€ ์ปค์ง = ์ €ํ™”์งˆ)',
                         minimum=DOWNSAMPLE_MIN, maximum=DOWNSAMPLE_MAX, step=1, default=5),
        gr.inputs.Slider(label='์‚ฌ์šฉํ•  ์ƒ‰๊น”์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š” (์„ ํƒ ์‹œ ์•„๋ž˜ ํŒ”๋ ˆํŠธ ์„ค์ •์€ "none"์œผ๋กœ ํ•ด์ฃผ์„ธ์š”)',
                         minimum=DOWNSAMPLE_MIN, maximum=DOWNSAMPLE_MAX, step=1, default=5),
        gr.inputs.Dropdown(label='์ƒ‰๊น” ํŒ”๋ ˆํŠธ๋ฅผ ์„ ํƒํ•˜์„ธ์š” (์„ ํƒ ์‹œ ์œ„์˜ ์ƒ‰๊น” ๊ฐœ์ˆ˜๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค)',
                           choices=PALETTE_CHOICES, default='none', type='value'),
        gr.inputs.Dropdown(label='๊ฒฐ๊ณผ ์ด๋ฏธ์ง€์˜ ๋ถ€๋“œ๋Ÿฌ์›€ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค ("dithering")', 
                           choices=DITHER_CHOICES, default='none', type='value'),
    ],
    outputs=[
        gr.outputs.Image(label='๊ฒฐ๊ณผ ์ด๋ฏธ์ง€ ์ž…๋‹ˆ๋‹ค')
    ],
    examples=examples,
    enable_queue=True,
    article='<p style="text-align:center">Credits to <a href="https://github.com/sedthh/pyxelate">GitHub</a></p>',
)

iface.launch(debug=True)