Color, imatges i transparència ============================== Color ----- * `La física del color `__ * `Percepció del color `__ * `Models de color `__ - `El model RGB `__ - `Els models HLS i HSV `__ * Una `breu història de l'evolució del color als videojocs `__. 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: #. *Per-image transparency*. Les surfaces [sense píxels transparents] poden tenir un valor (global) de transparència. Vegeu `[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] `__. #. *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 .. image:: Exemple_colors.png :height: 50 :align: center .. code:: python >>> 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: .. code:: python >>> finestra.fill((255,255,255)) >>> finestra.blit(surf, (0,0)) >>> finestra.blit(surf, (250,0)) >>> finestra.blit(surf, (280,40)) >>> 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 :doc:`calcular col·lisions <../Col·lisions/index>`.