Diseño y Construcción de Sistemas Interactivos,

Aplicando Experiencias Basadas en el Tratamiento de Imágenes

 

Fernando Galindo Soria     fgalindo@ipn.mx

   Jesús Antonio Jiménez Aviña

IPN-ESCOM

Av. Miguel Othón de Mendizával y Av. Juan de Dios Batís s/n

Zacatenco, Cd. de México

Cd. de México, Mayo de 1996

 


Resumen: La Interactividad estudia los mecanismos para lograr que dos o más dispositivos, organismos o sistemas se relacionen reciproca y simultáneamente entre si, de tal manera que las acciones e información generada por unos repercutan en los otros. Es un área en la que se manejan cientos de miles de millones de dólares y en la que se involucran la robótica, realidad virtual, sistemas evolutivos, telecontrol, inteligencia artificial, simuladores, biótica, multimedia, comunicaciones, control distribuido, música por computadora, etc.

 

La Interactividad es una de las áreas de mayor desarrollo a nivel mundial, sin embargo en nuestras escuelas prácticamente no existen cursos sobre este tema., Lo anterior es en parte por desconocimiento y en parte porque se cree que requiere muchos recursos. Lo ultimo es relativamente cierto, por ejemplo, si se quiere realizar un sistema de realidad virtual o de reconocimiento de voz normalmente no se cuenta con los recursos necesarios para hacerlo.

 

Sin embargo, al analizar múltiples sistemas interactivos nos damos cuenta que manejan componentes parecidos y que es relativamente fácil aplicar los conocimientos adquiridos al desarrollar unos sistemas en el desarrollo de otros.

 

Se podría decir que es distinto manejar sonido, presión, temperatura o imágenes, pero lo único distinto es la forma como lo percibimos, ya que si manejamos imágenes tendremos que sacarlas por el monitor y en el caso de sonido por la tarjeta de sonido o por la bocina, pero la computadora los trata a todos como cadenas de 0's y 1's.

 

Por ejemplo, normalmente lo único que sabemos del sistema de graficación, es que consta de un monitor y una tarjeta de video, pero si empezamos a profundizar nos damos cuenta que es una mina de información sobre interactividad y que prácticamente todo lo que se maneja en un sistema interactivo, tiene una representación concreta en un sistema de graficación.

 

Es por lo anterior que en este trabajo proponemos que un camino factible para introducir a los estudiantes de Informática y Computación en la interactividad es a través del estudio y manejo de los sistemas de graficación.

Uno de los problemas que se presentan en esta propuesta, es la gran fragmentación del conocimiento ya que mientras en una fuente explican cómo graficar en algún lenguaje, en otras presentan que las imágenes se almacenan en algún tipo especial de formato, en otras hablan de diferentes tipos de tarjetas gráficas, en fin otras presentan la Teoría del Color. Si se profundiza mas, se encuentra que la información sobre formatos gráficos, arquitectura de las tarjetas y sobre su manejo esta muy dispersa, y se detecta que se requieren conocimientos que normalmente se dan desvinculados en los cursos de Arquitectura de Computadoras, Sistemas Operativos y Ensambladores.

 

Es por lo anterior que en este trabajo presentaremos ejemplos en los cuales se ataca el problema del manejo de imágenes y veremos que es similar al del sonido -es prácticamente igual ya que también se manejan interrupciones, puertos, formatos, memoria, etc. y fácilmente una persona que aprendió a manejar imágenes pasa a sonido- y al de otros tipos de mecanismos interactivos.

 

Entre otros temas se vera como cambiar de un modo gráfico a otro usando interrupciones y un ejercicio sencillo para introducir al manejo de puertos y a la programación de tarjetas, consistente en cambiar los valores de la paleta de colores programando directamente los puertos que controlan al DAC de la tarjeta de video.

 

Otro de los problemas clásicos dentro de la Interactividad se presenta en el manejo masivo de información, en particular cuando se manejan imágenes o sonido se esta tratando con cantidades masivas de información, ya que por ejemplo, una sola imagen contiene alrededor de 256 mil caracteres, por lo que se mostraran ejemplos de manejo de sonido e imagen en forma masiva dentro de una computadora, .incluyendo el manejo de formatos de video y sonido, con el fin de introducir al tema y mostrar que los diferentes problemas de interactividad siguen siendo similares.

 

 

 

 

 

I.  INTRODUCCIÓN.

 

La Interactividad o el área de los sistemas interactivos estudia los mecanismos y la forma para lograr que dos o más dispositivos o sistemas se relacionen reciproca y simultáneamente entre si, de tal manera que las acciones e información generada por unos repercutan en los otros. Es un área en la que se manejan cientos de miles de millones de dólares y en la que se involucran la robótica, realidad virtual, sistemas evolutivos, telecontrol, inteligencia artificial, simuladores, biótica, multimedia, comunicaciones, control distribuido, música por computadora, etc.

 

Los sistemas interactivos se encuentran presenten en prácticamente todas las actividades cotidianas. Por ejemplo, la interrelación entre el sensor de temperatura y un calentador para regular la temperatura del agua., la forma como se relacionan una cámara de video con una televisión, una computadora con un sistema de audio, en los sistema para detectar la presencia de personas en un cuarto, en un simulador (de vuelo, del metro, de una planta termoeléctrica), en sistemas de telecontrol, etc.

 

Esta es una de las áreas de mayor desarrollo mundial, sin embargo en nuestras escuelas prácticamente no existen cursos sobre este tema., Lo anterior es en parte por desconocimiento y en parte porque se cree que se requiere muchos recursos. Lo ultimo es relativamente cierto, por ejemplo, si se quiere realizar un sistema de realidad virtual o de reconocimiento de voz normalmente no se cuenta con los recursos necesarios para hacerlo

 

Sin embargo, al analizar múltiples sistemas interactivos nos damos cuenta que manejan componentes parecidos y que es relativamente fácil aplicar los conocimientos adquiridos al desarrollar unos sistemas en el desarrollo de otros. Prácticamente en todos los casos se construyen o manejan aparatos, interfaces y programas y se requiere usar interrupciones, puertos, archivos con formato, manejadores de entrada / salida, microcontroladores, circuitos programables, etc.

 

Si se logra crear conciencia entre los estudiantes de las similaridades entre estos sistemas, es relativamente fácil para ellos aplicar los conocimientos adquiridos para desarrollar unos en el desarrollo de los otros.

 

Y una cosa curiosa y muy interesante es que, no se requiere contar con una gran cantidad de recursos para aprender a construir este tipo de sistemas. Ya que en los sistemas de cómputo actuales existen sistemas interactivos completos que en su momento pueden servir para introducir a la gente en la interactividad sin necesidad de conseguir recursos externos. Tal es el caso de los sistemas de graficación y en general de manejo de imágenes de las computadoras.

 

Comúnmente lo único que sabemos del sistema de manejo de imágenes de las PC´s, es que consta de un monitor y una tarjeta que comunica el monitor con la computadora, pero si empezamos a profundizar nos damos cuenta que estamos entrando en una mina de información sobre interactividad y que prácticamente todo lo que se maneja en un sistema interactivo, tiene una representación concreta en un sistema de graficación por computadora.

Es por lo anterior que en este trabajo proponemos que un camino factible para introducir a los estudiantes de Informática y Computación en la interactividad es a través del estudio y manejo de los sistemas de graficación.

 

Uno de los problemas que se presentan en esta propuesta, es la gran fragmentación del conocimiento ya que mientras en una fuente explican cómo graficar en algún lenguaje, en otras presentan que las imágenes se almacenan en algún tipo especial de formato -pero sólo lo mencionan y no indican en qué consiste-, en otras hablan de diferentes tipos de tarjetas gráficas -pero no explican como se programan-, en fin otras presentan la Teoría del Color. Si se profundiza mas, se encuentra que la información sobre formatos gráficos, arquitectura de las tarjetas y sobre su manejo esta muy dispersa, y se detecta que se requieren conocimientos que normalmente se dan desvinculados en los cursos de Arquitectura de Computadoras, Sistemas Operativos y Ensambladores, .

 

Y prácticamente en todos los casos se requieren construir o conseguir los aparatos, las interfaces y desarrollar los programas para manejar los sistema interactivo. Para una gran cantidad de casos se requiere conocer y manejar: interrupciones, puertos, archivos con formato, manejadores de entrada / salida, microcontroladores, circuitos programables, lectura de discos, programación en binario de los registros de las tarjetas, manejo de memoria, etc.

 

Es por lo anterior que en este trabajo presentaremos ejemplos sobre manejo de imágenes y veremos que el problema es similar al del sonido -es prácticamente igual ya que también se manejan interrupciones, puertos, formatos, memoria, etc. y normalmente una persona que aprendió a manejar imágenes pasa directamente a sonido- y al de otros tipos de mecanismos interactivos.

 

 

II.  ARQUITECTURA GENERAL DE UN SISTEMA INTERACTIVO.

 

Como primer punto comentaremos que, en un sistema interactivo es necesario lograr que al menos dos objetos se interrelacionen, por ejemplo una cámara de video con una videograbadora, para lo cual se requiere normalmente un mecanismo de interfase entre los dos objetos.

 

 

 


 

 

En particular en el caso de las computadoras, la arquitectura de un sistema interactivo es:

 

 

 

y mas específicamente

 

 

 

Si detallamos mas los componentes del sistema interactivo se llega a una arquitectura como la siguiente

 

 


Como se podrá ver, las principales actividades que se realizan en un sistema interactivo son comunes a cualquier tipo de sistema, pero sin embargo en el caso particular de estos sistemas se tienen ciertas características que convienen resaltar: una es la capacidad de procesamiento en tiempo real, ya que un sistema interactivo tiene que tener un tiempo de respuesta muy rápido, otra es que comúnmente las interfaces con el sistema no son las tradicionales, sino que usan prácticamente cualquier mecanismo de adquisición y salida de información.

 

Otra característica común a este tipo de sistemas es que normalmente manejan grandes cantidades de información, ya que, por ejemplo en el envío de una imagen o de una canción entre dos dispositivos se esta manejando mas volumen de datos de los que se maneja en muchos de los procesos administrativos tradicionales.

 

Una ultima característica consiste en que, si se desarrolla un sistema interactivo especifico, la experiencia particular se puede migrar fácilmente a muchos otros, ya que en todo los casos se requiere desarrollar mecanismo de captura, procesamiento, almacenamiento y salida de los datos.

 

Por lo que a pesar de que es muy fácil rendirse y no entrar al área de la interactividad por falta de recursos, ya que, no siempre se cuenta con todo el equipo que se quisiera, esta posición no es valida, ya que todas las computadoras cuentan con una tarjeta de video, por lo que podemos introducirnos a la interactividad programando la tarjeta de video y posteriormente migrando esta experiencia a otros tipos de dispositivos.

 

Se eligió la tarjeta de video porque los problemas involucrados en su manejo son problemas clásicos que se presentan al manejar cualquier otro dispositivo interactivo como una tarjeta de sonido o de adquisición de datos, ya que todas estas tarjetas se pueden programar directamente y prácticamente en todos los casos en forma parecida.

 

Por lo que, a continuación se mostrara como se enfrentan los problema de entrada / salida y almacenamiento de información en un sistema interactivo, usando como casos particulares la programación de la tarjeta de video para que realice algunas funciones especificas y el almacenamiento y despliegue de imágenes en una computadora.

 

La programación de cualquier dispositivo interactivo puede ser extremadamente compleja y en su caso existen libros completos de cientos de paginas para programar algunos de estos, por lo que no es el objetivo dar un curso sobre el tema, sino simplemente mostrar con ejemplos sencillos como se puede programar un dispositivo interactivo y crear conciencia de que este proceso se puede realizar con muchos otros dispositivos.

 

 

III.  CONTROLADORES DE VIDEO.

 

Se podría decir que es distinto manejar sonido, presión, temperatura o imágenes, pero lo único distinto que tienen es la forma como lo percibimos, ya que la computadora los trata de la misma forma, como cadenas de 0's y 1's. Si manejamos imágenes tendremos que sacar la información por medio del monitor y en el caso del sonido por medio de la tarjeta de sonido o por la bocina interna de la PC.

 

Para manejar cualquiera de estos tipos de información, además de que es aconsejable conocer como se transmite el sonido o como se generan los colores -ya que, entender esto facilita el manejo de la información-, debemos saber también como programar los dispositivos de entrada y salida.

 

Por ejemplo para manejar gráficas por computadora los compiladores de C y Pascal ya cuenta con controladores de video como los *.bgi, los cuales nos permiten manejar el modo gráfico para varios tipos de tarjetas, desde CGA y EGA hasta VGA.

 

Pero a pesar de que en una tarjeta normal VGA la memoria consta de 256K estos controladores solo permiten una resolución máxima de 640X480 píxeles y 16 colores. Si queremos realizar un trabajo de mejor calidad tenemos que ocupar controladores como el VGA256.BGI o SVGA256.BGI, que aumenta el manejo de colores de 16 a 256. y dependiendo del tipo de tarjeta aumenta la resolución.

 

Otra opción consiste en construir nuestro propio controlador, para lo cual debemos programar directamente la tarjeta de video. Ahora bien, la información para programarla se encuentra muy dispersa y es difícil de conseguir. Por lo que a continuación se dará una introducción al tema.

 

Si contamos con una tarjeta VGA tenemos ya por default 256 colores y una resolución de 320X200 (modo 13h), lo cual da un total de 64K de memoria convencional, Por lo que, un primer ejercicio de programación de la tarjeta de video consiste en cambiar nuestra tarjeta al modo 13h (dependiendo del lenguaje los números hexadecimales se indican con un $ en Pascal, 0x en C o una h en ensamblador)

 

A. Cambio Del Modo De Video.

 

Para cambiar la computadora de un modo de video a otro usando interrupciones se puede usar la siguiente rutina que llama a la interrupción 10h que es la interrupción del video del BIOS:

 

void modogra(int modo)//inicia el modo de video para tarjetas hasta vga

{

 union REGS reg;

 reg.h.ah=0;

 reg.h.al=modo;

 int86(0x10,&reg,&reg);

}

 

y si dentro del programa se llama a la instrucción

 

modogra(0x13)

 

la maquina se pone en modo 13h

 

Antes de terminar el programa es conveniente regresar a la computadora a un modo normal, para lo cual se puede usar por ejemplo las instrucciones:

 

 modogra(0x12);/

/regresa a modo de video 12h 640*480*16 colores

 

 textmode(C80);//pasa a modo texto

 

 

B.  Memoria de Video.

 

Una de las características mas interesantes de la programación en modo 13h es que asociado a cada píxel de la pantalla se tiene una localidad de memoria, o sea que si pongo un valor en esa localidad de memoria automáticamente aparece un color en una posición de la pantalla con lo que se pueden sacar imágenes en la pantalla programando directamente la memoria.

 

El área de la computadora donde se almacenan las imágenes que salen por el video se conoce como memoria de video y empieza en la localidad A000:0000h.

 

Si estamos en modo 13h y mandamos escribir un valor en esa localidad podremos ver un punto en la parte superior del monitor. La ventaja de mandar a escribir directamente a memoria, es que agiliza bastante el manejo de información. (en otros modos no es tan directa la programación de la memoria de video por lo que se recomienda dejar ese problema para el momento en que se tenga mayor manejo del tema)

 

Para accesar a la memoria de video en C se debe declarar un apuntador mediante una instrucción como la siguiente:

 

char far *apun= (char far *) 0xA0000000;

 

Para mandar escribir un punto a una localidad se usa una instrucción como

 

*(apun+j*320+i)=c;

 

donde apun es la base o inicio de la memoria de video, i nos indica la columna, j el renglón donde se quiere poner el punto y c es el índice del color que se quiere poner.

 

Con lo anterior ya se tiene una base mínima para manejar directamente el video, sin embargo para la gran mayoría de actividades relacionadas con los dispositivo interactivo se requiere de la programación directa de puertos, por lo que a continuación se mostrara un pequeño ejemplo de esta actividad.

 

 

C.  Paleta De Colores.

 

Un ejercicio sencillo para introducir al manejo de puertos y la programación de tarjetas, consiste en cambiar directamente los valores de la paleta de colores, para lograr que tome valores entre 256,000 posibles colores, programando directamente los puertos que controlan al DAC (Digital Analogic Conversor) de la tarjeta de video.

 

La paleta de colores no es mas que una tabla de 256 registros con 3 componentes para cada registro. Los componentes son R, G, B (rojo, verde, azul).

 

La tarjeta de video cuenta con un DAC (Digital Analogic Conversor) el cual permite el acceso a la paleta de colores mediante los puertos 3C7h, 3C8h, 3C9.

 

Un puerto es un dispositivo Físico / Lógico que permite la conexión entre dos aparatos, programando directamente los puertos obtenemos la respuesta en un menor tiempo. Al aumentar la velocidad de respuesta se pueden realizar por ejemplo animaciones en tiempo real, y una interactividad mejor.

 

El manejo de puertos es muy simple pero puede se peligroso y en su momento se dificulta su uso porque, para cada aparato que se comunica mediante un puerto se requiere conocer el numero de puerto y los valores de las señales que permiten que funcione, y gran parte de esta información es poco accesible

 

Cuando se programan puertos se tiene que tomar en cuenta que muchas veces se esta programando directamente un pequeño procesador y sino se sabe manejar se corre el peligro de dañar un dispositivo, por lo que, es conveniente no realizar experimentos ni jugar con los puertos ya que son delicados, por lo que en los programas que siguen se recomienda tener cuidado y no ponerse ha "hacer experimentos" y si se quiere continuar profundizando sobre el tema, verificar siempre las instrucciones que se quieren usar.

 

 La función de los puertos del DAC es la siguiente:

3C7h En este puerto de debe almacenar el índice del color del que se quiere leer sus componentes R, G, B

 

3C8h En este puerto de debe almacenar el índice del color que se va a modificar en sus componentes R, G, B

 

3C9h Componentes del color (R, G, B)

 

Cada ves que se hace la llamada al puerto 3C9h automáticamente apunta al siguiente registro de color

 

Con un par de funciones podemos modificar los colores o crear nuevas tonalidades que antes no podíamos realizar.

 

//Rutina para leer un color especifico

void R_C(int C, int R, int G, int B)

 {

  outportb(0x3c7,C); //Escribimos el índice del color

  R= inportb(0x3c9); //Leemos componente Roja

  G= inportb(0x3c9); //Leemos componente Verde

  B= inportb(0x3c9); //Leemos componente Azul

 }

//Rutina para modificar un color con componente R, G, B.

void W_C(int C, int R, int G, int B)

 {

 outportb(0x3c8,C); //Escribimos el índice del color

 outportb(0x3c9,R); //Escribimos componente Roja

 outportb(0x3c9,G); //Escribimos componente Verde

 outportb(0x3c9,B); //Escribimos componente Azul

 }

 

Con estas funciones podemos tener un total de 256 K combinaciones de colores en una tarjeta de video VGA.

 

 

IV.  MANEJO DE INFORMACIÓN MASIVA.

 

Otro de los problemas clásicos dentro de la Interactividad se presenta en el manejo masivo de información, en particular cuando se manejan imágenes o sonido se esta tratando con cantidades masivas de información, ya que por ejemplo, una sola imagen contiene alrededor de 256 mil caracteres y un segundo de animación corresponde a 30 imágenes o sea 7,500,000 caracteres, por lo que se mostraran ejemplos de manejo de sonido e imagen en forma masiva dentro de una computadora, incluyendo el manejo de formatos de video y sonido, con el fin de introducir al tema y mostrar que los diferentes problemas de interactividad siguen siendo similares.

 

Estos dispositivos de captura cuentan con formatos propios o estándares para manejar información, entre los mas usuales para imágenes se tienen GIF, TIFF, JPG, PCX, BMP etc., y para sonido VOC, MOD, MIDI, WAV, etc. Algunos de estos formatos cuentan con cierto tipo de compactación, por lo cual es difícil manejarlos si no contamos con la información del formato. Pero otros son mas simples como es el caso del formato BMP para imagen y WAV para sonido. Por lo que a continuación se mostrara como se maneja información formateada.

 

A.  Formato BMP.

 

En la actualidad existen en el mercado diversos tipos de formatos para almacenar imágenes, su diversidad es muy grande. Algunos de los formatos mas populares son GIF, TIFF, JPG, BMP, etc. Todos estos formatos son comerciales y no es fácil encontrar información interna sobre ellos.

 

Uno de los formatos mas sencillos es el BMP (Mapa de Bits). Un archivo con formato BMP consta de dos partes: Cabecera y cuerpo. La cabecera esta compuesta de: la identificaron del formato del archivo, dirección de inicio del cuerpo, tamaño horizontal de la imagen, tamaño vertical de la imagen, el numero de bits por pixel y la paleta de colores.

 

Con la información de la cabecera obtenemos el tamaño de imagen. el tipo de resolución del archivo (si es de 2, 16 o 256 colores), y la paleta de colores propia de esa imagen.

En el cuerpo de la imagen se encuentra el valor del color de cada píxel, que se ira acomodando en la posición correspondiente de acuerdo al tamaño de horizontal y vertical, podemos pensar en algún momento que la imagen esta guardada de arriba hacia abajo lo cual es falso. El primer pixel del cuerpo corresponde a la parte inferior izquierda de la imagen, los demás pixeles se irán acomodando de izquierda a derecha y de abajo hacia arriba.

 

La ubicación de la información dentro del archivo es la siguiente:

 

BYTE                     SIGNIFICADO                        nombre de la variable

0               Identificación del archivo.

10            Lugar donde empieza el cuerpo                               CUERPO

18            Tamaño horizontal                                 TAM_X

22            Tamaño vertical.                                   TAM_Y

28            Bits por pixel.                                        BIT_PIXEL

30            Principio de la paleta de colores              .               PALETA

XX          El principio del cuerpo se calcula por medio de los bits por pixel            y la paleta de colores.

 

La paleta de colores es una tabla donde se tienen los colores de la imagen, cada color esta formado de 4 componentes R, G, B, A donde R, G, B, indican la cantidad de rojo, verde y azul de cada color, A es una mascara que nos indica como se combinara ese color con los demás, hay que tener cuidado ya que la paleta de colores esta escrita en el orden de B, G, R, A

 

A continuación se muestra un programa que despliega archivos con formato BMP en la pantalla de la PC.

 

/* Programa que despliega una imagen con formato BMP */

/* Realizado por: J. Antonio Jiménez Aviña */

/* 29-04-96 */

/*modificado por Fernando Galindo Soria

   rutina propia para cambiar paleta

   rutina propia para traer el color del siguiente pixel

   8/vi/96 Cd. de México.*/

#include <conio.h> //Cabeceras

#include <stdio.h>

#include <graphics.h>

FILE *BMP;

//Declaración de variables

char identificación[118];

long int CUERPO, TAM_X, TAM_Y, BIT_PIXEL,

                 PIXEL_byte, PALETA, PALETA_TAM;

int mask;

int ShowBMP(char* fname,int,int);

void leecabecera(void);

void leepaleta(void);

void escrcolordac16(char color,char r,char g,char b);

void leecuerpo(int,int);

 

void main(void)

 {

  int gdriver=DETECT,gmode;

  initgraph(&gdriver,&gmode,"");

  ShowBMP("ARCHIVO.BMP",0,0); //poner el nombre del archivo donde                                                     esta la imagen a desplegar

  getch();

  closegraph();

 }

int ShowBMP(char* fname,int x0,int y0)

{//Función que abre el archivo y despliega la imagen en el monitor

  BMP= fopen(fname,"rb");//abre el archivo de imagen

  if (BMP==NULL) return -1;

 

  leecabecera();

  leepaleta();

  leecuerpo(x0,y0);

  fclose(BMP);

  return 0;

}

 

void leecabecera(void)

{

 //lee la cabecera

  fseek(BMP,0,SEEK_SET);

  fread(&identificacion,sizeof(identificación),1,BMP);//lee que sea archivo                                                                                 tipo BMP

  fseek(BMP,10,SEEK_SET);

  fread(&CUERPO,sizeof(CUERPO),1,BMP); //Lugar donde empieza el                                                                               cuerpo.

  fseek(BMP,18,SEEK_SET);

  fread(&TAM_X,sizeof(TAM_X),1,BMP); //Tamaño horizontal.

  fseek(BMP,22,SEEK_SET);

  fread(&TAM_Y,sizeof(TAM_Y),1,BMP); //Tamaño vertical.

  fseek(BMP,28,SEEK_SET);

  fread(&BIT_PIXEL,sizeof(BIT_PIXEL),1,BMP);//Bits por pixel.

 

  PIXEL_byte=8/BIT_PIXEL;       //numero de pixels por byte

  mask=(1<<BIT_PIXEL)-1;

}

 

void leepaleta(void)

{ //lee del archivo la paleta de colores y la carga en la tarjeta de video

  typedef struct //Estructura para el color

  {

   unsigned char b, g, r, a;

  } Color;

  Color col;

  int k;

  PALETA_TAM=1<<BIT_PIXEL;

  PALETA=CUERPO-4*PALETA_TAM;     //Principio de la paleta de                                                                              colores.

 

  fseek(BMP,PALETA,SEEK_SET);

  for (k=0;k<PALETA_TAM;k++) //Cargando la paleta de colores

  {

   fread(&col,sizeof(col),1,BMP);

   escrcolordac16(k,(col.r)>>2,(col.g)>>2,(col.b)>>2);

  }

}

 

void escrcolordac16(char color,char r,char g,char b)

{/*cambia de color paleta llamando directamente a los puertos

    del convertidor analógico digital de la tarjeta de video

     utiliza initgraph y maneja paleta rgb de 16 colores b(lue) g(reen) r(ed)*/

 

 char indcol[]={0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63};

 outportb(0x3C8,indcol[color]);/*inicializa el color*/

 outportb(0x3C9,r);

 outportb(0x3C9,g);

 outportb(0x3C9,b);

}

 

void leecuerpo(int x0,int y0)

{ //Función que regresa el color de los pixels

  // de acuerdo a sus componentes RGB y lo pone en la pantalla

 

 int xi=0, n=0, k,Xpal,Ypal;

 long int col[4];

 unsigned char b,b1[4];

 

 fseek(BMP,CUERPO,SEEK_SET);

 

 for (Ypal=TAM_Y-1; Ypal>=0; Ypal--) //Despliega la imagen en el monitor

 {xi=0; n=0;

 for (Xpal=0; Xpal<TAM_X; Xpal++)

 {

  if (xi%PIXEL_byte==0)      //desempaca los pixels empacados en un byte

  {

   fread(&b,sizeof(b),1,BMP);  //trae un byte del archivo

   k=PIXEL_byte-1;

   col[k]= b & mask;   //desempaca cada pixel y lo almacena en un arreglo

   while (k--) col[k]=(b>>=BIT_PIXEL) & mask; //regresa el índice del color                                                                       del siguiente pixel

   n++;             //cuenta cuantos bytes ha desempacado

  }

 

putpixel(x0+Xpal,y0+Ypal,col[xi++%PIXEL_byte]); //despliega el                                                                                    siguiente pixel

 }

 

 fread(&b1,1,(4-n%4)%4,BMP);//ignora bytes para quedar en múltiplos de 4

 }

}

 

B.  Manejo de Sonido.

 

Como se puede ver en un problema tan simple como el desplegar una imagen en pantalla se requieren tener una serie de conocimientos que normalmente pasan transparentes a los usuarios normales de la computación, pero que sin embargo, son cotidianos en el manejo de sistemas interactivos, por otro lado el manejo masivo de información requiere un tratamiento similar en el caso de archivos de voz, ya que también se requiere obtener la información del encabezado y usarla para desempacar los valores de los sonidos, por lo que, el desplegar imágenes es un buen ejercicio para manejo de información masiva, que se puede aplicar directamente al manejo de otros tipos de datos como es el caso del sonido, por lo que a continuación se comentara sin entrar a detalle y con el fin de que se vea la semejanza con el manejo de imágenes unos ejemplos de manejo masivo de sonido.

 

Dentro de los archivos de sonido, unos de los mas importantes son los que tienen formatos tipo WAV y VOC. En estos formatos podemos grabar tanto música como voz.

 

El formato de Microsoft Waveform (WAV), es uno de los mas populares actualmente gracias a Windows y sus múltiples aplicaciones en Multimedia, ya que su calidad de sonido es lo bastante buena al ser grabado en 8 o 16 BYTES. Lo malo es que ocupa demasiado espacio para unos cuantos segundos de sonido.

 

El formato WAV esta organizado de acuerdo a la estructura RIFF (formato de archivo de intercambio de recurso). Esta estructura fue diseñada hace varios años para los archivos de recursos multimedia, Un archivo de Formato WAV esta compuesto de las siguientes partes.

 

Cabecera

 

 * Identificación del formato RIFF (4 BYTES). Regresa la cadena    "RIFF".

 

* Longitud de datos del formato RIFF (4 BYTES).

 

* Identificación del formato como formato de sonido (WAV) (4 BYTES).            Regresa la cadena "WAVE".

 

* Datos del formato RIFF (puede o no existir) La longitud se da en  longitud         de datos del formato RIFF.

 

* Identifica al bloque como un fragmento de formatos (4 BYTES).  Regresa la      cadena "fmt"

 

* Longitud de los datos del formato que viene a continuación (4            BYTES).

 

* Categoría al que pertenece el formato WAV (2 BYTES). No esta       documentada pero si regresa un 01 indica que es un formato   Pulse Code Modulation (PCM).

 

* Canales de salida. (2 BYTES). Indica si es un archivo Mono o              Estéreo.                  1 para Mono y 2 para Estéreo.

 

* Frecuencia de muestreo , muestras por segundo a la que debe de           reproducir                cada canal (2 BYTES). Este valor esta dado en Hertz.

 

* Numero medio de BYTES que deben de transmitirse por segundo (2    BYTES)

                . También se puede calcular por la siguiente formula

                  Numero medio de BYTES por segundo =

                               Canales * Numero de muestras por segundo                  *(Numero de Bits por muestra/8)

                 Donde el Numero de Bits por muestra es igual al Numero de  Muestras por segundo entre ocho.

 

* Alineamiento del bloque (2 BYTES). Ya que la computadora              puede       procesar solo  un bloque a la ves. Este dato se utiliza para  alinear          los bufers de cada canal.

 

* Especifico del formato (2 BYTES). No se encuentra           documentado.

 

* Data Identifica al siguiente bloque como fragmento de datos (4           BYTES). Regresa la cadena  "fmt".

 

* Longitud del bloque (4 BYTES).Indica la longitud del cuerpo del          archivo   de sonido.

 

Cuerpo

 

* Bloque de datos. Es donde se encuentra grabada la información a         reproducir.

 

Como se puede observar cada uno de los datos tiene una longitud especifica la cual esta dada por el fabricante o bien dentro del formato.

 

Ahora bien existen muchas otras formas para almacenar y manejar datos masivos, por lo que, finalmente comentaremos otra de las formas de almacenamiento masivo de sonidos conocida como formato VOC.

 

Este tipo de formato es solo para archivos que hayan sido grabados por medio de un código de modulación de pulsos (PCM) de 8 bits.

 

El Formato VOC consta en su cabecera de un bloque de encabezamiento y un bloque de datos, dentro del bloque de datos puede haber a su ves diferentes tipos de bloques, los cuales proporcionan una manera elegante de programar pausas, repeticiones etc. Pero comúnmente solo encontramos

un tipo de bloque, el correspondiente a los datos de voz.

 

Como se puede observar el principal problema que se tiene para manejo de mucha de la información interactiva se reduce al conocimiento o desconocimiento de los formatos con que se almacena o transmite.

 

V. CONCLUSIÓN.

 

La interactividad es una de los campos mas importantes a nivel mundial e incluye áreas aparentemente tan disimbolas como la graficación, robótica, realidad virtual, proceso distribuido y muchas otras que si se analizan independientemente del problema especifico tienen practicante la misma arquitectura y los mismos componente. Por lo que, cada vez es mas importante que nuestros alumnos se introduzcan en esta área.

 

Sin embargo prácticamente no se desarrollan actividades académicas sobre este tema, porque se cree que se requiere contar con grandes infraestructuras para desarrollarlas. Es por lo anterior, que el objetivo de este trabajo es mostrar que nos podemos introducir en la interactividad sin necesidad de contar con grandes recursos, ya que prácticamente todos los problemas del desarrollo de un sistema interactivo están presentes en el manejo de una tarjeta de video.

 

Esta idea ya se ha comenzado a aplicar involucrando a estudiantes desde secundaria hasta postgrado, siendo muy gratificante observar como estos estudiantes cada vez han profundizando mas sobre este tema y lo fácil que a sido aplicar la experiencia obtenida en la programación de las tarjetas de video a la programación de otros tipos de dispositivos interactivos.

 

Con lo cual también se ha logrado romper un bloqueo tradicional ya que mucha gente no se a dado cuenta que si son capaces de manejar un dispositivo pueden manejar con relativa facilidad muchos otros y que es necesario romper con los feudos de conocimiento, ya que los problemas que se atacan son similares y corresponden a una gran área conocida como interactividad.

 

Bibliografía

Peter M. Ridge,  "Guía oficial de Sound Blaster",  Osborne McGraw-Hill España 1994.

 

Boris Bertelson & Mathias Rasch,  "PC al limite",  Data Beck Colombia 1995.

 

"PC Interno",  Data Beck.