miércoles, 27 de enero de 2016

Visualizador de imágenes BMP en C++ y Windows XP

Comparto en esta ocasión un trabajo que realicé hace algunos años. Se trata de un visualizador de imágenes BMP hecho en C++. Este programa corre en Windows XP debido a la compatibilidad de la librería utilizada. Para compilar y ejecutar el código recomiendo se haga con Turbo C++, mismo que les comparto al final de esta entrada.

El código genera un visualizador de imágenes BMP; sólo se puede visualizar una imagen a la vez y con ciertas condiciones, las cuales se describen a continuación:
  • Deben ser imágenes de mapa de bits únicamente (extensión .bmp)
  • Las dimensiones de la imagen deben ser de 320 x 200 pixeles (320 pixeles de ancho por 200 pixeles de alto).
  • La imagen debe ser de 256 colores.
Al abrir el programa con Turbo C++ (se encuentra en la carpeta TC/BIN/TC.EXE), deben ver una pantalla como la que se presenta en la Figura 1.

Figura 1. Turbo C++

Cuando se ejecute el programa, se verá primeramente la imagen predeterminada en color normal, como se muestra en la Figura 2.

Figura 2. Imagen visualizada

Si se presiona enter un par de veces, la imagen pasa por un filtro de escala de grises y es presentada (Figura 3).


Figura 3. Imagen visualizada en escala de grises

Este visualizador es solamente para poner en práctica las bases de la programación gráfica a un nivel un poco más bajo. Actualmente ya existen controles en la mayoría de IDE's que nos permiten visualizar imágenes con sólo pasar la ruta como parámetro de la imagen que deseamos visualizar en pantalla.

Otros ejemplos de imágenes de las mismas características son las siguientes:

Figura 4. Imagen BMP de 320 x 200 y 256 colores

Figura 5. Imagen BMP de 320 x 200 y 256 colores

Figura 6. Imagen BMP de 320 x 200 y 256 colores

Como inicialmente les comenté, recomiendo que ejecuten el código en el programa Turbo C++, bajo Windows XP; comparto la carpeta con Turbo C++, esa carpeta deben colocarla en C, de forma que la ruta sea: C:\TC.

Así mismo, de preferencia pongan la carpeta del visualizador en la unidad C, para que sea más fácil localizarla a través de Turbo C++, ya que, como el programa es algo viejo, el entorno gráfico no es muy amigable.

A continuación les dejo los links para que descarguen el programa Turbo C++:

Turbo C++

El código fuente así como las imágenes de ejemplo las pueden descargar a continuación de cualquiera de los dos servidores:


3 comentarios:

  1. PERO SI LO DESEO USAR ABRINDO EL MODO GRAFICO CON LA FUNCION INITGRAPH EN LUGAR DEL MODO RAPIDO 0X13 NO FUNCIONA PORQUE.....

    ResponderBorrar
    Respuestas
    1. #include
      #include
      #include
      #include
      #include

      struct header
      {
      char tipo[2];
      unsigned long tamano;
      char reservado[4];
      unsigned long offset;
      };

      /* Cabecera de informacion, informacion detallada */
      /* 40 bytes en total */
      struct bmp_info
      {
      unsigned long cabecera;
      unsigned long ancho;
      unsigned long alto;
      int planos;
      int bits_por_pixel;
      unsigned long compresion;
      unsigned long tamano_estructura;
      unsigned long medida_horizontal;
      unsigned long medida_vertical;
      unsigned long colores_usados;
      unsigned long colores_importantes;
      };

      struct RGB
      {
      char b;
      char g;
      char r;
      char reservado;
      };


      void leer_paleta(char *paleta);
      void leer_color(unsigned char color, char *r, char *g, char *b);
      void definir_color(unsigned char color,char r,char g,char b);
      void Cargar_BMP(char* Nombre, int xImagen, int yImagen);
      void definir_paleta(char *paleta);


      //void pixel(int x, int y, unsigned char color);
      char paleta_original[768];


      int huge DetectSvga()
      {
      return 2;// 4 for 1024x768,2 for 640x480
      }
      void main()
      {

      int gdriver = DETECT,gmode;
      installuserdriver("SVGA256",&DetectSvga);
      initgraph(&gdriver,&gmode,"c:\\bgi"); //path maybe diff. in your comp.
      leer_paleta(paleta_original);
      setfillstyle(1,156);
      bar(0,0,500,400);
      getch();
      Cargar_BMP("c:\\casa.bmp",100,100);


      getch();
      }

      void leer_paleta(char *paleta)
      {
      int i;

      for(i=0; i<256; i++)
      leer_color(i, &paleta[i*3], &paleta[i*3+1], &paleta[i*3+2]);
      }

      void leer_color(unsigned char color, char *r, char *g, char *b)
      {
      outportb(0x3C7, color);

      *r = inportb(0x3C9);
      *g = inportb(0x3C9);
      *b = inportb(0x3C9);
      }

      void Cargar_BMP(char* Nombre, int xImagen, int yImagen)
      {
      FILE *archivo;
      char paleta[768];
      unsigned char color;
      int ancho;
      int x, y;
      unsigned int posicion=0;
      struct header Cabecera;
      struct bmp_info Informacion;
      struct RGB colores;

      archivo = fopen(Nombre,"rb");

      fread(&Cabecera, sizeof(char), 14, archivo);
      fread(&Informacion, sizeof(char), 40, archivo);

      fseek(archivo,54,SEEK_SET);
      for(int i=0; i<256; i++)
      {
      paleta[i*3+2] = getc(archivo) >>2;
      paleta[i*3+1] = getc(archivo) >>2;
      paleta[i*3] = getc(archivo) >>2;
      getc(archivo);
      }

      // ancho=0;
      // yImagen = 200 - (Informacion.alto+yImagen);

      for(y=0; y 0)
      {
      color = getc(archivo);
      putpixel(xImagen+x,yImagen+y,(int)color);
      x--;

      }
      /*while(x < 320)
      {
      color = 0;
      putpixel(xImagen,yImagen,color);
      posicion++;
      x++;
      } */
      }
      definir_paleta(paleta);
      fclose(archivo);
      }
      void definir_paleta(char *paleta)
      {
      int i;

      for(i=0; i<256; i++)
      definir_color(i, paleta[i*3], paleta[i*3+1],paleta[i*3+2]);
      }

      void definir_color(unsigned char color,char r,char g,char b)
      {
      outportb(0x3C8,color);
      outportb(0x3C9,r);
      outportb(0x3C9,g);
      outportb(0x3C9,b);
      }

      Borrar
  2. FAVOR D RESPONDER cyberzoom2009@gmail.com

    ResponderBorrar