Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Regalo este codigo para conocimiento, cargar un BMP en pantalla desde DOS

Estas en el tema de Regalo este codigo para conocimiento, cargar un BMP en pantalla desde DOS en el foro de C/C++ en Foros del Web. Hola a todos, quiero donar este código fuente. Lo que hace es cargar una imagen bmp en pantalla de 8 bits ( en windows 7 ...
  #1 (permalink)  
Antiguo 18/09/2012, 13:03
TSW
 
Fecha de Ingreso: septiembre-2012
Mensajes: 2
Antigüedad: 11 años, 7 meses
Puntos: 0
Información Regalo este codigo para conocimiento, cargar un BMP en pantalla desde DOS

Hola a todos, quiero donar este código fuente. Lo que hace es cargar una imagen bmp en pantalla de 8 bits ( en windows 7 no funciona el programa ). Se que no es gran cosa pero hacia años que queria hacer lo mismo , ya que una vez vi a un amigo
que lo hizo en 1999 en pascal y me quedé fascinado , llevaba tiempo con esa "espinilla" y al final lo hice y la verdad que es una gran satisfaccion ver que funciona, tambien decir que me ayudaron un poco sobre todo con la documentacion , ya que no entendia "ni papa", hasta que me fui metiendo y aqui esta. Ya el año pasado colgué la primera version por ahi , no me acuerdo donde ... pero cargaba solo 320x200 de tamaño de imagen, aqui juego con el modo VESA cambiando de bancos (todo esto está obsoleto ), hacia tiempo que tenia el fuente en el disco duro , pero cualquier dia formateo o lo que sea y lo pierdo ... Como a mi me costó entender las cosas ya que estaba a 0 total, aqui lo dejo mas o menos comentado por si alguien tiene alguna duda , se que esto no es el programa del año pero bueno, mientras buscaba por internet algun ejemplo , vi muy pocos , eso fue lo que me ha animado para colgarlo. Gracias !

Para usarlo necesitas el BORLAND C++ 5.0 y WINXP en modo nativo , para poder cambiar a pantalla completa real , en virtual a mi no me funcionaba bien.



Código:
//BITMAP LOADER BY TSW 2012.

//PROGRAMADOR     : Gabriel González González

//VERSION         : 2.0

//E-MAIL          : [email protected]

//NOVEDADES       : Es posible cargar imagenes grandes,

//					cambiando bancos de memoria y mayor velocidad de carga.

//

//AGRADECIMIENTOS A MIGUEL Y A BOB (Canadá) POR SU AYUDA

//NOTA:

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//Este programa carga archivos BMP a 8 bits ( 256 colores)

//fue hecho para ver como cargar una imagen , compilado en BORLAND C++ 5.0

//bajo Windows XP, cualquier duda ya tienen mi e-mail ;). 

//para usarlo creen una imagen bmp con el MSPAINT y en guardar como, elijan

//256 colores. Deberia funcionar. y en el path , pongan el nombre de su imagen.

//se que esto no es para dar un premio , pero, tenia curiosidad y aprendi

//un monton , que es lo interesante.

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>   //LIBRERIAS

#include <conio.h>

#include <string.h>

#include <dos.h>



void carga_total(char *fichero);

void lee_datos(long lugar);

unsigned char *vga = (unsigned char *) MK_FP(0xA000,0); //defino puntero FAR ( con segmento y desplazamiento ) 
	//que apunta a la MEMORIA DE VIDEO 0xA000

FILE *archivo;



void main()

{



	//La llamada la hago varias veces para comprobar la velocidad

	//de carga entre imagen e imagen.

	

   cout << "BITMAP LOADER 2.0 BY TSW\n";

   cout << "Pulse una tecla para empezar la carga ...\n";

   getch();

   carga_total("c:\\ibiza.bmp");

   getch();

   carga_total("c:\\ibiza.bmp");

   getch();

   carga_total("c:\\ibiza.bmp");

   getch();

   carga_total("c:\\ibiza.bmp");

   getch();

}



void carga_total(char *fichero)

{



	char *fil = fichero;

	archivo = fopen(fil,"rb"); //binario



	if(archivo == NULL )

		printf("ERROR GRAVE !!! NO SE HA PODIDO ABRIR EL ARCHIVO!!!\n");



	unsigned char valor;

	unsigned char r,v,a,c;

	unsigned int cuenta_colores;

	cuenta_colores = 0;



    //Elijo tipo de resolucion en modo VESA

	asm

   {

	  mov ax,4f02h

      mov bx,107h

      int 10h

	}



	//Me situo justo donde empieza la paleta de colores

	fseek(archivo,54L,SEEK_SET); //--- numero colores bmp



   //Voy leyendo de 4 en 4 bytes, el nº 4 nulo, solo valen

   //los 3 primeros ( mira la documentacion del bmp )

   do

   {

  		fread(&valor,1,1,archivo);

		a = (valor/4); //divido entre 4 porque el valor maximo tiene que

						//ser 63 porque los colores usan 7 bits, no 8.

						//1111111 = 63. (de 0 a 63 ) 64 combinaciones de color

		fread(&valor,1,1,archivo);

		v = (valor/4);



		fread(&valor,1,1,archivo);

		r = (valor/4);



		fread(&valor,1,1,archivo);



      outportb(0x3c8,cuenta_colores); //envio cada color al puerto de la VGA

  	   outportb(0x3c9,r);  //r

  	   outportb(0x3c9,v);  //v

  	   outportb(0x3c9,a);  //a



   	cuenta_colores = cuenta_colores + 1;

    }

	while(cuenta_colores <= 255);



    int banco = 0;

	long lugar = 1078; //me situo justo donde empiezan los datos del dibujo

					   //los colores.



    //En este caso la resolucion pide 20 bancos de memoria 

    //creo que es 1300x1200 dividido entre 65535 = 20

    //no me acuerdo que resolucion , busca resoluciones VESA, te apareceran

    //los valores disponibles

	

	for ( int i = 0; i < 20 ; i++) //pues de 0 a 20 bancos

   {

      asm  //cambio de banco ...0,1,2,3... 20

      {

         mov ax,4f05h

         xor bx,bx

         mov dx,[i] //elijo el banco y cambio

         int 10h

      }



   	lee_datos(lugar); //funcion que llena de UN GOLPE 65535 bytes

   	//por lo tanto gana velocidad y la carga es automatica

      lugar = lugar + 65535; //en el archivo me voy moviendo de 65535 en

      //65535 , para el siguiente banco

   }



   fclose(archivo);

}



void lee_datos(long lugar)

{

  	fseek(archivo,lugar,SEEK_SET); //me situo en el sitio indicado

	fread(vga,65535,1,archivo); //escribo en la memoria de video 65535 bytes

								//desde donde diga el puntero del archivo.

								//la funcion fread permite eso.

}

Etiquetas: bmp, borland, conocimiento, funcion, int, pantalla, programa, regalo, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:54.