/* Rutinas que manejan una imagen con formato BMP para 2 a 16 colores*/ /* Realizado por: J. Antonio Jimenez Avi¤a */ Hunab. ESCOM IPN. 29/iv/96 Cd. de Mexico /*modificado por Fernando Galindo Soria Cd. de Mexico. rutina propia para cambiar paleta rutina propia para traer el color del siguiente pixel 8/vi/96*/ /* salva imagenes con formato BMP 3/viii/96 Fernando Galindo Soria */ /*En la actualidad existen en el mercado diversos tipos de formatos para almacenar imagenes, su diversidad es muy grande. Algunos de los formatos mas populares son GIF, TIFF, JPG, BMP, etc. Todos estos formatos son comerciales por lo cual no es facil encontrar informacion interna sobre ellos. Uno de los formatos mas sencillos es el BMP (Mapa de Bits). Un BMP como todo archivo con formato consta de dos partes principales. Cabecera y cuerpo. La cabecera esta compuesta de: la identificaron del formato del archivo, direccion 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 informacion de la cabecera obtenemos el tama¤o de imagen. el tipo de resolucion 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 pixel, que se ira acomodando en la posicion correspondiente de acuerdo al tama¤o de horizontal y vertical, podemos pensar en algun 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 demas pixeles se iran acomodando de izquierda a derecha y de abajo hacia arriba. La ubicacion de la informacion dentro del archivo es la siguiente: BYTE SIGNIFICADO nombre de la variable 0 Identificacion del archivo identificacion 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 demas. Hay Que tener cuidado ya que la paleta de colores esta escrita en el orden de B,G,R,A. */ /*A ccntinuacion sse muestra un ejemplo de programa que maneja archivos con formato BMP en la pantalla de la PC. void main(void) { int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,""); ShowBMP("arches.BMP",0,0);//poner el nombre del archivo donde esta la imagen a desplegar gotoxy(1,20);printf("despliega imagen"); SalvaBMP("gatos.BMP",0,0); printf(" salva imagen"); ShowBMP("gatos.BMP",0,0); printf(" despliega imagen salvada"); getch(); closegraph(); }*/ #include //Cabeceras #include #include #include #include #include "tgrafica.fgs" FILE *BMP, *BMP1; //Declaracion de variables long int CUERPO, TAM_X, TAM_Y, BIT_PIXEL, PIXEL_byte, PALETA, PALETA_TAM; int mask; char identificacion[118]; 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); int SalvaBMP(char* fname,int,int); void salvacabecera(void); void salvapaleta(void); void leecolordac16(char,char*,char*,char*); void salvacuerpo(int,int); void leetrans(int,int,int); int salvaimagen(char* fname,int xi,int yi,int xf,int yf) /*Rutina que toma una imagen de la pantalla y la almacena en un archivo con formato BMP y le asigna la identificacion por defaul */ { int i; char identidefaul[118]="BMv( v ( {     € € €€ € € € €€ €€€ ŔŔŔ ˙ ˙ ˙˙ ˙ ˙ ˙ ˙˙ ˙˙˙ "; for(i=0;i<118;i++)identificacion[i]=identidefaul[i]; CUERPO=118; TAM_X=xf-xi; TAM_Y=yf-yi; BIT_PIXEL=4; PIXEL_byte=2; SalvaBMP(fname,xi,yi); return 0; } void traeimagen(char* fname,int xi,int yi) { ShowBMP(fname,xi,yi);//poner el nombre del archivo donde esta la imagen a desplegar } int ShowBMP(char* fname,int x0,int y0) //Funcion 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(identificacion),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<>2,(col.g)>>2,(col.b)>>2); //esta en tgrafica.fgs } } void leecuerpo(int x0,int y0) { 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>=BIT_PIXEL) & mask; //regresa el indice del color del siguiente pixel n++; //cuenta cuantos bytes ha desempacado } putpixel(x0+Xpal,y0+Ypal,col[xi++%PIXEL_byte]);//despliega el siguiente pixel } if(k>=0) while ((k--)!=0){putpixel(x0+Xpal+k,y0+Ypal,(b>>=BIT_PIXEL) & mask);} fread(&b1,1,(4-n%4)%4,BMP);//ignora bytes para quedar en multiplos de 4 } } int transpBM(char* fname,int x0,int y0,int porciento) //Funcion que abre el archivo y despliega la imagen en el monitor { randomize(); BMP= fopen(fname,"rb");//abre el archivo de imagen if (BMP==NULL) return -1; leecabecera(); leepaleta(); leetrans(x0,y0,porciento); fclose(BMP); return 0; } void leetrans(int x0,int y0,int porciento) { 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>=BIT_PIXEL) & mask; //regresa el indice del color del siguiente pixel n++; //cuenta cuantos bytes ha desempacado } if(random(100)=0) while ((k--)!=0){putpixel(x0+Xpal+k,y0+Ypal,(b>>=BIT_PIXEL) & mask);} fread(&b1,1,(4-n%4)%4,BMP);//ignora bytes para quedar en multiplos de 4 } } int SalvaBMP(char* fname,int x0,int y0) //Funcion que almacena la imagen del monitor en un archivo con formato BMP // 3/viii/96 Fernando Galindo Soria { BMP1= fopen(fname,"wb");//abre el archivo de imagen if (BMP1==NULL) return -1; fseek(BMP1,0,SEEK_SET); fwrite(&identificacion,sizeof(identificacion),1,BMP1);//indica que es archivo tipo BMP salvacabecera(); salvapaleta(); salvacuerpo(x0,y0); fclose(BMP1); return 0; } void salvacabecera(void) { //salva la cabecera fseek(BMP1,10,SEEK_SET); fwrite(&CUERPO,sizeof(CUERPO),1,BMP1);//Lugar donde empieza el cuerpo. fseek(BMP1,18,SEEK_SET); fwrite(&TAM_X,sizeof(TAM_X),1,BMP1); //Tama¤o horizontal. fseek(BMP1,22,SEEK_SET); fwrite(&TAM_Y,sizeof(TAM_Y),1,BMP1); //Tama¤o vertical. fseek(BMP1,28,SEEK_SET); fwrite(&BIT_PIXEL,sizeof(BIT_PIXEL),1,BMP1);//Bits por pixel. } void salvapaleta(void) { //lee de la tarjeta de video la paleta de colores y la carga en el archivo typedef struct //Estructura para el color { unsigned char b, g, r, a; } Color; Color col; int k; PALETA_TAM=1<=0; Ypal--) //almacena la imagen del monitor en un archivo { k=PIXEL_byte-1; n=0; for (Xpal=0; Xpal