sábado, 19 de abril de 2025

MAV. Python


PyGame



Objeto imagen

Para incluir una imagen en nuestra ventana lo primero que nos debemos plantear es qué función cumplirá dicha imagen, si como elemento de la aplicación o como escenario de la acción que se va a desarrollar en la ventana. 



Diferencio dos funciones básicas para una imagen: como elemento de la ventana y de la historia que en ella se cuenta y como imagen de fondo o escenario en el que se desarrolla la acción. Los problemas que nos vamos a encontrar no tienen soluciones muy diferentes, pero sí lo son conceptualmente. 
Pero lo primero que debemos resolver es la carga de la imagen en la ventana, cosa que hacemos gracias a la función image.load() (img_a = pygame.image.load('assets/taza.png'))

Cuando nuestro objetivo es usar la imagen como componente de la escena (los usos posibles son muchos) lo que nos interesa es acertar con la ubicación y con el tamaño. Ambos se resuelven teóricamente...
  • gracias al tamaño de la propia imagen, que conocemos mediante (Propiedades | Detalles) o al uso de un programa de edición de imágenes, que nos informan del tamaño de la imagen en pixeles.
  • ... y mediante la función blit(), que admite como parámetros una tupla con la posición xy de la esquina superior izquierda de la imagen (ventana.blit(taza,(100,50)) coloca la imagen taza en la posición x = 100, y = 50). Deberemos, esos sí, probar con diferentes valores x-y para lograr un posicionamiento que se ajuste a nuestros objetivos y gustos.
Pero ahora nos encontramos con dos problemas (que son en realidad el mismo) según que nuestro objetivo para la imagen sea uno (como elemento de la pantalla) u otro (como fondo de la pantalla o escenario de la acción): el tamaño de la imagen NO se ajusta a lo que deseamos; la imagen es muy pequeña o demasiado grande.

En ambos casos cabe la solución de modificar el tamaño original de la imagen mediante un programa de tratamiento de imágenes, y es posible que esta sea la mejor solución, pero no es necesario y tampoco es posiblemente suficiente según para qué objetivo (por ejemplo no lo es si vamos a hacer uso de la ventana a pantalla completa).

Lo que yo te propongo es hacer uso de una función disponible en PyGame que nos permite modificar el tamaño de la imagen (pygame.transform.scale()), función que recibe como primer parámetro la propia función que nos sirvió para cargar la imagen a la que se añade además una función de ajuste de la calidad de la imagen (convert()), y como segundo parámetro la tupla de tamaño de la imagen (img=pygame.transform.scale(pygame.image.load("assets/coas.jpg").convert(),(200,250)))

Pues bien, según el uso que vamos ha hacer de la imagen te propongo dos modos diferentes de emplear este conjunto de opciones, empezando por un uso de la imagen como objeto (vs. fondo)

En ambos casos primero deberemos crear la ventana siguiendo el [procedimiento ya conocido] (ventana = pygame.display.set_mode((ANCHO,ALTO))), incluyendo (obligatoriamente en este primer ejemplo, opcionalmente pero recomendable en el segundo) asignar un color de fondo a nuestra ventana (ventana.fill(BLANCO)).

Ahora expongo mi propuesta para un uso de la imagen como objeto de la ventana:
  • Primero accedo a los valores ancho y alto de la imagen (vg.  img_ancho = taza.get_width()) mediante las funciones get_width() get_height()
  • y después utilizo estos valores para redimensionar la imagen a mi gusto (taza_bis = pygame.transform.scale(taza, (img_ancho//2, img_alto//2))), 
  • ... siendo esta imagen redimensionada la que implemento en la ventana en la posición que deseo (ventana.blit(taza_bis,(100,100)))
En este enlace te dejo acceso al script que desarrolla mi propuesta. La imagen la puedes descargar desde aquí, aunque deberás ubicarla dentro de una carpeta llamada assets, ubicada dentro del directorio donde guardes el script.

La segunda forma de uso de la imagen es como fondo de ventana. En este caso no es necesario dar color a la ventana, aunque se puede hacer igualmente. Lo importante ahora es controlar el tamaño original de la imagen, ya que debe existir coincidencia entre éste y el de la propia ventana. Esto lo podemos logar invirtiendo el procedimiento que seguimos antes, de modo que, conocido el tamaño de la imagen mediante las funciones get_width()get_height(), y asignándolas a sendas constantes (ANCHO y ALTO), las utilicemos como valores que definen el tamaño de la ventana.

El problema es que esto puede dar lugar a extraños y poco usuales tamaños de ventana, por lo que como solución no termina de convencer. Y lo malo es que si no existe coincidencia entre ventana e imagen, o bien se va a ver que la imagen no ocupa toda la ventana


... o sólo se verá una parte de la imagen como fondo. Y esto se acentúa si usamos el modo pantalla completa (FULLSCREEN).

Evidentemente, como dije antes, nos queda la opción de reajustar el tamaño de la imagen con un programa de edición de imágenes, y no debemos descartar hacerlo así, especialmente si no vamos a usar el modo FULLSCREEN; pero también podemos usar la función transform.scale(), ahora de un modo un tanto diferente (fondo = pygame.transform.scale(pygame.image.load("assets/espacio.jpg").convert(),(ANCHO,ALTO))), que usa como segundo parámetro la tupla formada por las mismas constantes de tamaño que empleamos para dimensionar la ventana.

Aquí el tema de la posición de la imagen (ventana.blit(fondo,(0,0))) solo tiene una solución: en la coordenada (0,0).

También desde aquí puedes descargar el script de uso de imagen como fondo. Y [aquí tienes la imagen] usada como fondo. Debes proceder del mismo modo que con la imagen de la taza.

No hay comentarios:

Publicar un comentario

Comenta esta entrada