Skip to content

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'

  • 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_brillo contiene un if brillo > 255 que no tiene sentido, ya que el parámetro brillo es 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 a int en lugar de float, lo que rompe la signatura exigida por el enunciado.
  • La función prepara definida 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_brillo y cambia_desplazamiento es similar, pero la estructura de bucles y cálculos está bien implementada.
  • La falta de comentarios en partes clave (como la justificación de min y max) dificulta entender por qué se usan esas operaciones.
  • La presencia de código inutilizado (prepara) y errores de lógica (como el if brillo > 255) generan confusión.

Sigue buenas prácticas de programación

El programa no sigue buenas prácticas:

  • Variables globales innecesarias: img, ancho y alto se declaran globales, pero no se usan coherentemente.
  • Redundancia: En cambia_brillo y cambia_desplazamiento, los cálculos para cada componente RGB se repiten con código duplicado.
  • Errores de tipo: Convertir el factor de brillo a int en lee_argumentos viola 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

  1. Corregir la lógica de cambia_brillo:

    • Eliminar el if brillo > 255 y usar directamente el factor brillo en los cálculos.
    • Ejemplo: r = int(min(255, r * brillo)).
  2. Ajustar lee_argumentos:

    • Convertir el segundo argumento a float con float(sys.argv[2]) para cumplir con la signatura exigida.
  3. Eliminar la función prepara:

    • No se usa en el programa y no es parte del enunciado.
  4. Mejorar el estilo PEP8:

    • Añadir espacios en asignaciones como r = max(0, r) (antes r= max(...)).
    • Revisar sangrías y comentarios para mayor claridad.
  5. Simplificar cálculos:

    • Usar una función auxiliar para evitar repetir código en cambia_brillo y cambia_desplazamiento, por ejemplo:
      def ajusta_componente(valor: int, factor: float, desplazamiento: int) -> int:
          # Aplicar brillo y desplazamiento, luego clamar entre 0 y 255
  6. Validar argumentos:

    • Asegurarse de que sys.argv tiene los tres argumentos necesarios, y manejar errores con mensajes claros.