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:

import sys
import pixels
from pixels import *

def cambia_brillo(brillo: float): #sumarle el valor de todos los cananles o bajarle el valor de todos los canales
    ancho = pixels.ancho
    alto = pixels.alto
    for x in range (ancho):
        for y in range (alto):
            r, g, b = pixels.lee(x,y)
            r = max(0, min(255, r * brillo))
            g = max(0, min(255, g * brillo))
            b = max(0, min(255, b * brillo))
            pixels.pinta(x,y, (int(r),int(g),int(b)))



def cambia_desplazamiento(desplazamiento: int): #sumarles o restarles un numero a los colores
    ancho = pixels.ancho
    alto = pixels.alto
    for x in range (ancho):
        for y in range (alto):
            r, g, b = pixels.lee(x,y)
            if desplazamiento > alto or desplazamiento > ancho:
                print("La imagen se saldría del lienzo")
                exit()

    pixels.pinta(x + desplazamiento,y + desplazamiento,(int(r),int(g),int(b)))


def lee_argumentos() -> tuple[str, float, int]:
    if len(sys.argv) != 4:
        print("Se necesitan 3 elementos: la imagen en.gif, el cambio de brillo (número real) y el desplazamiento de colores (número entero):")
        exit()
    else:
        imagen = sys.argv[1].strip()
        brillo = float(sys.argv[2])
        desplazamiento = int(sys.argv[3])
        tuple = (imagen, brillo, desplazamiento)
    return tuple


def main():
    imagen, brillo, desplazamiento = lee_argumentos()
    pixels.prepara(imagen)
    cambia_brillo(brillo)
    cambia_desplazamiento(desplazamiento)
    pixels.espera()

if __name__ == "__main__": #si ejecuto este programa como programa principal, ejecutame lo demas.
    main()

Análisis

Cumple con el enunciado

  • cambia_brillo: La función cumple parcialmente con el enunciado. Multiplica cada componente RGB por el factor de brillo y lo limita entre 0 y 255, pero no se especifica qué hacer si el factor es negativo (aunque el enunciado no lo prohíbe, el código lo maneja correctamente).
  • cambia_desplazamiento: No cumple con el enunciado. En lugar de sumar el desplazamiento a los componentes RGB, el código intenta desplazar la posición de los píxeles (x + desplazamiento, y + desplazamiento), lo cual es incorrecto. Además, el condicional if desplazamiento > alto or desplazamiento > ancho es irrelevante para el problema planteado.
  • lee_argumentos: Cumple con el enunciado, pero el uso de tuple como nombre de variable es incorrecto (conflictos con el tipo tuple de Python).

Es fácil de leer y entender

  • Variables y comentarios: Los comentarios están en español y son claros, pero el nombre tuple en lee_argumentos puede confundir a principiantes.
  • Lógica de desplazamiento: La función cambia_desplazamiento es difícil de entender porque mezcla conceptos de desplazamiento de píxeles (coordenadas) con ajuste de color, lo cual no corresponde al enunciado.
  • Estructura general: La estructura del programa sigue el orden solicitado, pero la implementación de cambia_desplazamiento es confusa.

Sigue buenas prácticas de programación

  • Wildcard import: El uso de from pixels import * no es recomendable (sobreescribe variables y dificulta la lectura).
  • Manejo de errores: En cambia_desplazamiento, el exit() es abrupto y no se justifica (el enunciado no menciona restricciones en el desplazamiento).
  • Redundancia: La variable tuple en lee_argumentos es innecesaria (se puede retornar directamente (imagen, brillo, desplazamiento)).

Recomendaciones de mejora

  1. Corregir cambia_desplazamiento:

    • Eliminar el condicional if desplazamiento > alto or desplazamiento > ancho.
    • Sumar el desplazamiento a cada componente RGB: r + desplazamiento, g + desplazamiento, b + desplazamiento.
    • Limitar los valores entre 0 y 255 (como en cambia_brillo).
  2. Evitar tuple como nombre de variable:

    • Renombrar tuple a args o valores en lee_argumentos.
  3. Eliminar from pixels import *:

    • Usar solo import pixels para evitar conflictos y mejorar la claridad.
  4. Validar tipos de entrada:

    • Asegurar que sys.argv[2] y sys.argv[3] se conviertan correctamente a float e int (agregar try-except para manejar errores).
  5. Simplificar lee_argumentos:

    • Retornar directamente la tupla sin asignarla a una variable: return (imagen, brillo, desplazamiento).
  6. Revisar indentación en cambia_desplazamiento:

    • La llamada a pixels.pinta está fuera de los bucles for, lo que causaría que solo se pinte un píxel (el último del bucle). Debe estar dentro del bucle para modificar todos los píxeles.