File size: 2,337 Bytes
c2058a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import random
from PIL import Image
import matplotlib.pyplot as plt


# Define pixel sizes for different levels
pixel_sizes = [128, 96, 64, 32, 24, 16, 12, 8, 4, 2]
# Function to pixelate an image
def pixelate(image, pixel_size):
    # Reduce the image size
    small = image.resize((image.size[0] // pixel_size, image.size[1] // pixel_size), Image.Resampling.NEAREST)
    # Scale back to original size
    return small.resize(image.size, Image.Resampling.NEAREST)

# dictionary of photo name and url
celeb_list = ["Tom Cruise", "Jake Gyllenhal", "Natalie Portman", "Aubrey Plaza", "Oscar Isaac", "Kate Winslet", "Ellen DeGeneres"]
celeb_folder = {
    "Tom Cruise" : "./Celebs/TomCruise.jpeg",
    "Jake Gyllenhal"  : "./Celebs/JakeGyllenhal.jpg",
    "Natalie Portman" : "./Celebs/NataliePortman.png",
    "Kajol"   : "./Celebs/Kajol.png",
    "Oscar Isaac" : "./Celebs/OscarIsaac.jpg",
    "Nayanthara" : "./Celebs/Nayanthara.jpg",
    "Dhanush" : "./Celebs/Dhanush.jpg",    
}


def Clear(prev_size, photo=celeb_list[1], folder=celeb_folder, next=False):
    if next:
        index = celeb_list.index(photo) + 1
        photo = celeb_list[index]
        
    print(f"Processing {photo}")
    image_path = folder[photo]
    img = Image.open(BytesIO(image_path))    

    for curr_size in pixel_sizes:
        if curr_size<prev_size:
           return pixelate(img, i), photo, curr_size


# # Display the pixelated images progressively
# for idx, img in enumerate(images):
#     plt.figure(figsize=(6, 6))
#     plt.imshow(img)
#     plt.axis("off")
#     plt.title(f"Guess the Portrait - Level {idx + 1}")
#     plt.show()

with gr.Blocks(theme=gr.themes.Ocean()) as demo:
    gr.Markdown(MARKDOWN)
    with gr.Row():
        with gr.Column(scale=1):
            pixelated_image = gr.Image(type='pil', image_mode='RGB', label='Pixelated Image')
            with gr.Accordion("Answer", open=False):
                answer = gr.Textbox()

        Clear_button = gr.Button(value='Clear', variant='primary')
        Next_button = gr.Button(value='Next', variant='secondary')
        
    Clear_button.click(fn=Clear, inputs=[256], outputs=[pixelated_image, answer, prev_size])
    Next_button.click(fn=Clear, inputs=[256, photo==answer, next==True], outputs=[pixelated_image, answer, prev_size])

demo.launch(debug=False, show_error=True)