Revisión automática de la práctica 03-imagen
Este es el resultado de una revisión automática de la prácica 03-imagen, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.
- Comprobación de archivos con extension '.py'
- Comprobación con ficheros de plantilla
- Comprobación con ficheros de solución
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
Comprobación de archivos con extension '.py'
- Archivos Python excluidos de la búsqueda: pixels.py, invert.py
- Archivos Python encontrados (excluyendo esos): process.py
Correcto, se elige process.py como entrega.
Comprobación con ficheros de plantilla
Los archivos son diferentes de los de la plantilla.
Comprobación con ficheros de solución
Los archivos son diferentes de los de la solución.
Revisión automática de programa
Programa revisado:
from tkinter import Tk, Canvas, PhotoImage, mainloop, _get_default_root, IntVar
import pixels, sys
img = None
ancho = None
alto = None
def prepara(foto: str = None):
"""Prepara el lienzo con la foto indicada"""
global img, ancho, alto
window = Tk()
imagen = PhotoImage(file=foto)
ancho = img.width()
alto = img.height()
canvas = Canvas(window, width=ancho, height=alto)
canvas.pack()
canvas.create_image((ancho // 2, alto // 2), image=img, state="normal")
def cambia_brillo(brillo: float):
if brillo > 255:
brillo = 255
for x in range(pixels.ancho):
for y in range(pixels.alto):
(r, g, b) = pixels.lee(x, y)
r = int(min(255, brillo * r))
r= max(0, r)
g = int(min(255, brillo * g))
g= max(0, g)
b = int(min(255, brillo * b))
b= max(0, b)
pixels.pinta (x,y, (r, g, b))
def cambia_desplazamiento(desplazamiento: int):
for x in range(pixels.ancho):
for y in range(pixels.alto):
(r, g, b) = pixels.lee(x, y)
r = int(min(255, desplazamiento + r))
r= max(0, r)
g = int(min(255, desplazamiento + g))
g = max(0, g)
b = int(min(255, desplazamiento + b))
b = max(0, b)
pixels.pinta (x,y, (r, g, b))
def lee_argumentos() -> tuple[str, float, int]:
imagen = str(sys.argv[1])
brillo = int(sys.argv[2])
desplazamiento = int(sys.argv[3])
return imagen, brillo, desplazamiento
def main():
imagen, brillo, desplazamiento = lee_argumentos()
pixels.prepara(imagen)
cambia_brillo(brillo)
cambia_desplazamiento(desplazamiento)
pixels.espera()
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa no cumple completamente con el enunciado. Hay varios errores críticos:
- La función
cambia_brillocontiene unif brillo > 255que no tiene sentido, ya que el parámetrobrilloes un factor multiplicativo (float) y no un valor de color. Esto hace que si el usuario introduce un brillo mayor que 255 (como 1.5), el código lo sobreescribe incorrectamente a 255, distorsionando el resultado. - En
lee_argumentos, el segundo argumento (brillo) se convierte ainten lugar defloat, lo que rompe la signatura exigida por el enunciado. - La función
preparadefinida en el código no se usa nunca, y el enunciado no la menciona como parte del programa a entregar.
Es fácil de leer y entender
El código podría ser más claro para un principiante:
- La lógica de
cambia_brilloycambia_desplazamientoes similar, pero la estructura de bucles y cálculos está bien implementada. - La falta de comentarios en partes clave (como la justificación de
minymax) dificulta entender por qué se usan esas operaciones. - La presencia de código inutilizado (
prepara) y errores de lógica (como elif brillo > 255) generan confusión.
Sigue buenas prácticas de programación
El programa no sigue buenas prácticas:
-
Variables globales innecesarias:
img,anchoyaltose declaran globales, pero no se usan coherentemente. -
Redundancia: En
cambia_brilloycambia_desplazamiento, los cálculos para cada componente RGB se repiten con código duplicado. -
Errores de tipo: Convertir el factor de brillo a
intenlee_argumentosviola la especificación del enunciado. -
Espaciado incorrecto: En líneas como
r= max(0, r), falta un espacio antes del=para seguir PEP8.
Recomendaciones de mejora
-
Corregir la lógica de
cambia_brillo:- Eliminar el
if brillo > 255y usar directamente el factorbrilloen los cálculos. - Ejemplo:
r = int(min(255, r * brillo)).
- Eliminar el
-
Ajustar
lee_argumentos:- Convertir el segundo argumento a
floatconfloat(sys.argv[2])para cumplir con la signatura exigida.
- Convertir el segundo argumento a
-
Eliminar la función
prepara:- No se usa en el programa y no es parte del enunciado.
-
Mejorar el estilo PEP8:
- Añadir espacios en asignaciones como
r = max(0, r)(antesr= max(...)). - Revisar sangrías y comentarios para mayor claridad.
- Añadir espacios en asignaciones como
-
Simplificar cálculos:
- Usar una función auxiliar para evitar repetir código en
cambia_brilloycambia_desplazamiento, por ejemplo:def ajusta_componente(valor: int, factor: float, desplazamiento: int) -> int: # Aplicar brillo y desplazamiento, luego clamar entre 0 y 255
- Usar una función auxiliar para evitar repetir código en
-
Validar argumentos:
- Asegurarse de que
sys.argvtiene los tres argumentos necesarios, y manejar errores con mensajes claros.
- Asegurarse de que