/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Cargador de BMP 320 x 200 x 256, mi obra maestra jejejeje

 
      Índice del Foro elrincondelc.com -> Gráficos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
tsw



Registrado: 04 Jun 2011
Mensajes: 10

MensajePublicado: 04/07/2011 1:51 pm
Título: Cargador de BMP 320 x 200 x 256, mi obra maestra jejejeje

Bueno señores, después de tanto esfuerzo, tiempo y dedicación , por fin he terminado mi cargador de bitmap para imagenes 320x200 256 colores para MSDOS, para muchos programadores expertos quizas sea una tonteria el programa, pero para llevar 1 mes aprendiendo C/C++ y mas de 2 meses recopilando informacion sobre como funciona el DAC de la grafica... la estructura de un archivo grafico... etc ..., yo , conmigo mismo estoy muy satisfecho por el resultado.

Este programita me lo tomé como un reto, y me llevo tiempo. Bueno , si alguno quiere aprender a programar , le recomiento que intente hacer "chorraditas" de estas ,ya que aprendes un monton, porque una cosa te lleva a la otra , y cuando te das cuentas has aprendido un monton de conceptos que te hacen falta para desarrollar el programa y aprendes a apreciar como funcionan los entornos graficos de hoy en dia, ya que es muy bonito ver una ventanita, pero no sabes como se estructura eso, yo no sabia que habian cambios de bancos para mostrar imagenes de mas de 320x200.

El programa lo hice en una maquina que tengo en casa ( mi primer PC 1997) un Pentium 166 MMX , 32 MB RAM. con Win98. En Borland C++ 5.02 .

Seguro que este codigo se puede optimizar mejor y hacer mejor , pero bueno, aqui va el codigo:

Código:

//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);
}


PD : Cuando carga la imagen se verá al reves, es por culpa del BMP que los bytes estan ordenados "del reves" , cosas de Microsoft, para verla correctamente tendras que invertirla con un programa de edicion de imagen. Yo use el Corel 4.0 ya que hace imagenes BMP para esta "epoca" , porque con el PAINT de windows XP , no se aprecian todos los colores, por lo visto no tiene la misma estructura el bmp, es la misma , pero algo cambia.

Bueno , no pretendo que me den una palmadita en la espalda, solo compartir "mi obra maestra " jejejeje.

graciasss.
Volver arriba
Karman



Registrado: 15 Oct 2005
Mensajes: 538

MensajePublicado: 05/07/2011 3:25 pm
Título:

te recomendaría utilices algún tipo de filemapping (mapear a memoria el archivo) te serviría para que no salga invertida la imagen aparte de facilitarte las cosas...

S2
_________________


-. Karman .-
Volver arriba
      Índice del Foro elrincondelc.com -> Gráficos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com