//BITMAP LOADER BY TSW 2011. //PROGRAMADOR : Gabriel Gonz lez Gonz lez //E-MAIL : //AGRADECIMIENTOS A MIGUEL Y A BOB (Canadá ) POR SU AYUDA //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <graphics.h> #include <iostream.h> #include <stdio.h> #include <stdlib.h> //LIBRERIAS #include <conio.h> #include <string.h> #include <dos.h> #include <math.h>
unsigned char *vga =(unsigned char *) MK_FP(0xA000,0); unsigned char *pvirtual=NULL;
informacion(); //subprograma cabecera void putpixel(int x,unsigned char color, unsigned char *lugar); void flip(void); void cls(unsigned char color, unsigned char *lugar);
main() { //SUBPROGRAMA INFORMACION clrscr(); cout << "BITMAP LOADER 1.0 BY TSW\n";
char *fil = "c:\\gabriel1.bmp"; FILE *archivo; archivo = fopen(fil,"rb"); //binario
if(archivo == NULL ) printf("ERROR GRAVE !!! NO SE HA PODIDO ABRIR EL ARCHIVO!!!\n"); if (archivo) printf("ARCHIVO ABIERTO CON XITO !!!\n");
cout << "Ruta de Archivo " << fil ; cout << "\n---------------------------------------\n"; cout << "INFORMACIàN DE CABECERA ARCHIVO BMP \n"; cout << "---------------------------------------\n";
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
long tamano; long offset; long ancho; //nombro variables long alto; int planos; int bpp; long compresion; long tamanoBmpPixel; long NumColores; char tipo[1]; //Tipo BMP ( Microsoft,OS/2...)
tamano = 0; offset = 0; ancho = 0; //inicializo variables para que no tomen valores extra¤os alto= 0; planos= 0; bpp= 0; compresion= 0; tamanoBmpPixel= 0; NumColores= 0;
fseek(archivo,0L,SEEK_SET); //Tipo de bmp fread(tipo,1,2,archivo); printf("þ Tipo de BMP = %s \n",tipo); // rewind(archivo);
fseek(archivo,2L,SEEK_SET); //---tama¤o archivo bmp fread(&tamano,1,4,archivo); printf("þ Tama¤o de BMP = %lu Bytes\n",tamano);
fseek(archivo,10L,SEEK_SET); //----offset archivo fread(&offset,1,4,archivo); printf("þ Offset BMP = %d (Datos im gen empiezan en este byte)\n",offset);
fseek(archivo,18L,SEEK_SET); //----ancho archivo fread(&ancho,1,4,archivo); //guardo en &ancho, 1 registro de 4 bytes. printf("þ Ancho de BMP = %d\n",ancho);
fseek(archivo,22L,SEEK_SET); //----alto bmp fread(&alto,1,4,archivo); printf("þ Alto de BMP = %d\n",alto);
fseek(archivo,26L,SEEK_SET); //----numero de planos fread(&planos,1,2,archivo); printf("þ Numero de planos BMP = %d\n",planos);
fseek(archivo,28L,SEEK_SET); //----bit por pixel ( 256 colores 8 bit) fread(&bpp,1,2,archivo); printf("þ Bit por pixel (BPP) = %d\n",bpp);
fseek(archivo,30L,SEEK_SET); //----compresion archivo bmp fread(&compresion,1,2,archivo); printf("þ ¨Existe compresi¢n? (0->NO) = %d\n",compresion);
fseek(archivo,34L,SEEK_SET); //---cantidad en pixel fread(&tamanoBmpPixel,1,4,archivo); printf("þ Tama¤o im gen %lu pixeles\n",tamanoBmpPixel);
fseek(archivo,46L,SEEK_SET); //--- numero colores bmp fread(&NumColores,1,4,archivo); printf("þ N£mero de colores de im gen %d\n",NumColores);
cout << "\n"; cout << "PULSE UNA TECLA PARA MOSTRAR EL BMP EN PANTALLA"; getch();
long rojo,verde,azul; unsigned int contador; long cuenta_colores; unsigned char dato; long valorLetra; int valor; //con INT SALE MAS COLOR original CHAR int r,v,a,c; r = 0; v= 0; a= 0; c= 0; valor = 0; valorLetra = 0; cuenta_colores = 0; contador = 0; dato = 0;
asm{ mov ah,0 mov al,13h int 10h }
fseek(archivo,54L,SEEK_SET); //--- numero colores bmp do {
outportb(0x3c8,cuenta_colores); fread(&valor,1,1,archivo); valorLetra = valor; azul = abs(valorLetra /4); //falta poner valor ascii valorLetra = 0; a = azul;
fread(&valor,1,1,archivo); valorLetra = valor; verde = abs(valorLetra/4 ); valorLetra = 0; v = verde;
fread(&valor,1,1,archivo); valorLetra = valor; rojo = abs(valorLetra/4 ); valorLetra = 0; r = rojo;
fread(&valor,1,1,archivo); valorLetra = 0; cuenta_colores = cuenta_colores + 1;
outportb(0x3c9,r); outportb(0x3c9,v); outportb(0x3c9,a); }
while(cuenta_colores <= 255); getch();
pvirtual = (char *) malloc(64000);
cls(0,pvirtual); do {
fseek(archivo,1078L+contador,SEEK_SET); fread(&dato,1,1,archivo); contador = contador + 1 ; putpixel(contador,dato,pvirtual); } while (contador <=63779);
flip();
getch();
asm{ mov ah,0 mov al,02h int 10h }
free(pvirtual); return(0); }
void putpixel(int x, unsigned char color, unsigned char *segmento) { memset(segmento+x,color,1); }
void flip() { memcpy(vga,pvirtual,64000); }
void cls(unsigned char color, unsigned char *lugar) { memset(lugar,color,0xffff); }
|