Color, imatges i transparència

Color

Imatges

Tipus d’imatges digitals: mapa de bits (raster o pixmap) i vectorials.

Les imatges digitals es poden representar utilitzant una paleta de colors.

Els mapes de bits solen estar en el format RGBA, que inclou informació sobre la transparència (canal alfa).

Formats de fitxers d’imatges. Els més usats en internet són:

  • JPEG: escala de grisos (8 bits) o bé truecolor (24 bits). No admet transparència. Compressió amb pèrdues.

  • PNG: paleta de 256 colors o bé truecolor (24/48 bits). Admet transparència. Compressió sense pèrdues.

  • GIF: paleta de 256 colors. Admet transparència i animacions (no suportades per pygame; vegeu però, [1]).

Les imatges en Pygame

  • Les imatges són objectes de classe Surface.

  • L’operació més habitual és blit: enganxar una imatge damunt d’una altra.

  • El mòdul transform proporciona operacions sobre la imatge completa: mirall, rotació, escalat, …

  • El mòdul draw proporciona funcions per dibuixar damunt d’una imatge: línies, polígons, cercles, el·lipses, …

  • El mòdul surfarray permet treballar a nivell de píxel accedint-hi com a les matrius de la biblioteca numpy.

  • La instanciació d’objectes de classe Surface té els paràmetres opcionals flags i depth que permeten controlar algunes característiques de la imatge com ara el tipus de transparència o l’ús de paleta.

Altres biblioteques de Python per treballar amb imatges: Pyhton Image Library (PIL), scikit-image.

Gestió de la transparència en pygame

La transparència és un valor, que sovint s’anomena alfa (alpha), que pot variar des de 0 (totalment transparent) fins a 255 (totalment opac). Així, un valor alfa=127 correspon a una transparència del 50%.

En pygame hi ha tres maneres d’aconseguir imatges transparents/translúcides:

  1. Per-image transparency. Les surfaces [sense píxels transparents] poden tenir un valor (global) de transparència. Vegeu [2].

  2. Utilitzant un color clau (color-key transparency). D’això se’n diu «tintar». Tots els píxels d’un cert color d’una surface [sense píxels transparents] són transparents. Vegeu [3].

  3. Per-pixel transparency. Cada píxel d’una surface de tipus RGBA té un valor alpha (A) de transparència. el «quart canal», també anomenat canal alfa, correspon al nivell de transparència. Vegeu el flag pygame.SRCALPHA a [4].

Les imatges RGBA només són suportades per segons quins formats de fitxer d’imatges (per exemple PNG, però no JPG). Per tant, si la imatge es carrega de fitxer, potser s’haurà de convertir a RGBA, si es vol transparència. En qualsevol cas, si volem mantenir la transparència en llegir de fitxer, caldrà utilitzar el mètode convert_alpha. Per exemple, si disposem de la imatge de més avall desada en el fitxer exemple_colors.png, podem provar de fer

../../_images/Exemple_colors.png
>>> import pygame
>>> pygame.init()
(6, 0)
>>> finestra = pygame.display.set_mode((600, 400))
>>> surf = pygame.image.load('exemple_colors.png').convert_alpha()

I després la visualitzem en diversos llocs:

>>> finestra.fill((255,255,255))
<rect(0, 0, 600, 400)>
>>> finestra.blit(surf, (0,0))
<rect(0, 0, 256, 256)>
>>> finestra.blit(surf, (250,0))
<rect(250, 0, 256, 256)>
>>> finestra.blit(surf, (280,40))
<rect(280, 40, 256, 256)>
>>> pygame.display.flip()

Tingueu en compte que encara que la imatge tingui píxels transparents, el rectangle de la surface sempre serà el de la tota la imatge; això és important a l’hora de calcular col·lisions.