Spaces:
Sleeping
Sleeping
Marcepelaez
commited on
Commit
•
2d40c9d
1
Parent(s):
25c85a3
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import numpy as np
|
3 |
+
from PIL import Image
|
4 |
+
|
5 |
+
# Función que ajusta los parámetros según la computadora seleccionada
|
6 |
+
def set_computer_params(computer):
|
7 |
+
if computer == "Commodore 64":
|
8 |
+
return 16, 4 # 16 niveles, pixelado moderado
|
9 |
+
elif computer == "ZX Spectrum":
|
10 |
+
return 8, 5 # 8 niveles, pixelado medio
|
11 |
+
elif computer == "Amstrad CPC":
|
12 |
+
return 16, 5 # 16 niveles, pixelado intermedio
|
13 |
+
elif computer == "Atari 8-bit (400/800)":
|
14 |
+
return 32, 6 # 32 niveles, pixelado más alto
|
15 |
+
elif computer == "Apple II":
|
16 |
+
return 6, 6 # 6 niveles, pixelado considerable
|
17 |
+
elif computer == "MSX":
|
18 |
+
return 16, 5 # 16 niveles, pixelado medio
|
19 |
+
elif computer == "NES (Nintendo)":
|
20 |
+
return 32, 4 # 32 niveles, pixelado moderado
|
21 |
+
elif computer == "IBM PC CGA":
|
22 |
+
return 4, 6 # 4 niveles, alto pixelado
|
23 |
+
return 16, 4 # Valores predeterminados (Commodore 64)
|
24 |
+
|
25 |
+
# Función principal que convierte la imagen según los parámetros seleccionados
|
26 |
+
def convert_to_pixelated_8bit(image, computer):
|
27 |
+
if image is None:
|
28 |
+
return None
|
29 |
+
|
30 |
+
# Obtener los parámetros según la computadora retro
|
31 |
+
intensity, pixelation_level = set_computer_params(computer)
|
32 |
+
|
33 |
+
# Convertir la imagen a numpy array
|
34 |
+
img_array = np.array(image)
|
35 |
+
|
36 |
+
# Calcular los niveles por canal según la intensidad seleccionada
|
37 |
+
levels = int(256 // intensity)
|
38 |
+
|
39 |
+
# Reducir la cantidad de colores basada en la intensidad
|
40 |
+
img_array = (img_array // levels) * levels
|
41 |
+
|
42 |
+
# Ajustar ligeramente el contraste
|
43 |
+
img_array = np.clip(img_array * 1.1, 0, 255).astype(np.uint8)
|
44 |
+
|
45 |
+
# Aplicar el efecto de pixelado reduciendo y restaurando la resolución
|
46 |
+
img_pil = Image.fromarray(img_array)
|
47 |
+
|
48 |
+
# Obtener las dimensiones originales
|
49 |
+
original_width, original_height = img_pil.size
|
50 |
+
|
51 |
+
# Calcular el tamaño reducido para el pixelado
|
52 |
+
pixel_width = max(1, original_width // pixelation_level)
|
53 |
+
pixel_height = max(1, original_height // pixelation_level)
|
54 |
+
|
55 |
+
# Redimensionar al tamaño más pequeño (pixelado) y luego de vuelta al tamaño original
|
56 |
+
img_pil = img_pil.resize((pixel_width, pixel_height), Image.NEAREST) # Reducir
|
57 |
+
img_pil = img_pil.resize((original_width, original_height), Image.NEAREST) # Volver al tamaño original
|
58 |
+
|
59 |
+
return img_pil
|
60 |
+
|
61 |
+
# Crear la interfaz gráfica de Gradio
|
62 |
+
iface = gr.Interface(
|
63 |
+
fn=convert_to_pixelated_8bit,
|
64 |
+
inputs=[
|
65 |
+
gr.Image(type="numpy", label="Subir Imagen"), # Subida de imagen
|
66 |
+
gr.Dropdown( # Selección de computadora retro
|
67 |
+
["Commodore 64", "ZX Spectrum", "Amstrad CPC", "Atari 8-bit (400/800)", "Apple II", "MSX", "NES (Nintendo)", "IBM PC CGA"],
|
68 |
+
label="Elige una computadora retro",
|
69 |
+
value="Commodore 64" # Valor predeterminado
|
70 |
+
)
|
71 |
+
],
|
72 |
+
outputs=gr.Image(type="numpy", label="Imagen convertida"), # Imagen resultante
|
73 |
+
title="Emulador de Gráficos de Computadoras Retro",
|
74 |
+
description="Sube una imagen y emula el estilo gráfico de computadoras de los años 80 con 8 bits y pixelado. Elige entre varias computadoras retro.",
|
75 |
+
# Agregando el mensaje "Hecho con ❤️ por Peláez"
|
76 |
+
article="Hecho con en MDQ❤️ por Peláez"
|
77 |
+
)
|
78 |
+
|
79 |
+
iface.launch()
|