• Lunes 29 de Abril de 2024, 03:15

Autor Tema:  Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP  (Leído 1971 veces)

TSW

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP
« en: Sábado 25 de Junio de 2011, 14:50 »
0
Hola señores , que tal ? les cuento:

Estoy haciendo un programa , ya lo tengo hecho , pero me falta la ultima parte, la mas importante.
El programa lo estoy haciendo un TURBO C++ 3.0 con una máquina antigua, Pentium 166 MMX y usando MSDOS 7.1 . Tengo ese PC para aprendizaje de ciertas cositas que los Sistemas Operativos de hoy en dia no te dejan aprender. Bueno , al grano:  

He hecho un cargador de BitMap,( carga imagánes bmp ) pero el problema es que voy leyendo y mostrando directamente en la video memoria, por lo tanto, voy viendo como carga la imagen. Es un proceso lento.

Segun he leido, lo que debo hacer es un doble buffer, o pantalla virtual, lo que haces es cargar los datos ahi ,y luego volcarlos a la video memoria. Eso se hace con malloc(), farmalloc(), o incluso llamando a la INT 21 Función 48 ( Asignar parrafos de memoria ). Lo que pasa es que hago esto y siempre se me cuelga el PC
Incluso usando INT 21 me dice que tengo poca memoria. Cosa que no es verdad.

Vamos , que no se como usar farmalloc, ni calloc, malloc ...y esa es mi duda.



Código: C++
  1.  
  2.  
  3. #include <graphics.h>
  4. #include <iostream.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>   //LIBRERIAS
  7. #include <conio.h>
  8. #include <string.h>
  9. #include <dos.h>
  10. #include <math.h>
  11. #include <alloc.h>
  12. #include <malloc.h>
  13. #include <mem.h>
  14.  
  15. main()
  16. {
  17.     clrscr();
  18.     int far *array;
  19.     array = (int far *) farmalloc(64000);
  20. do
  21.       {
  22.            array[contador] = 1;
  23.            contador = contador + 1;
  24.       }
  25. while(contador<=64000);
  26.  
  27. }
  28.  
  29.  

Cuando lo ejecuto se me cuelga el ordenador, ¿Por qué? Supuestamente no esta creado un espacio de memoria de 64000 bytes??¿?¿
¿Qué estoy haciendo mal? Porque la verdad que estoy desesperado.


Si alguien quiere usar el codigo para probarlo. Puede hacerlo creando un bmp con el paint y guardandolo como 256 colores ( guardar como ... 24 bits... 8 bits ... ) aunque probablemente lo vea mal , de hecho yo hice el bmp en Corel Draw 4.0 ( 1994 ) , me carga los bmp correctamente, ahora en un Paint normal , falla.


Tambien funciona en WINDOWS XP

Código: C++
  1.  
  2. //BITMAP LOADER BY TSW 2011.
  3. //PROGRAMADOR : Gabriel González González
  4. //E-MAIL : gabrielgg85@gmail.com
  5. //AGRADECIMIENTOS A MIGUEL Y A BOB (Canadá ) POR SU AYUDA
  6. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. #include <graphics.h>
  8. #include <iostream.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>   //LIBRERIAS
  11. #include <conio.h>
  12. #include <string.h>
  13. #include <dos.h>
  14. #include <math.h>
  15.  
  16. informacion(); //subprograma cabecera
  17.  
  18. main()
  19. {
  20. //SUBPROGRAMA INFORMACION
  21.  
  22.     clrscr();
  23.     cout << "BITMAP LOADER 1.0 BY TSWn";
  24.  
  25.     char *fil = "c:\nuevo1.bmp"; //aquí la ruta de tu archivo, no olvides poner DOBLE BARRA \ ,te recomiendo ponerlo en c: raiz el archivo.
  26.     FILE *archivo;
  27.     archivo = fopen(fil,"rb"); //binario
  28.  
  29.     if(archivo == NULL )
  30.     printf("ERROR GRAVE !!! NO SE HA PODIDO ABRIR EL ARCHIVO!!!n");
  31.     if (archivo)
  32.         printf("ARCHIVO ABIERTO CON XITO !!!n");
  33.  
  34. cout << "Ruta de Archivo " << fil ;
  35. cout << "n---------------------------------------n";
  36. cout << "INFORMACIàN DE CABECERA ARCHIVO BMP n";
  37. cout << "---------------------------------------n";
  38.  
  39. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  40.  
  41. long tamano;
  42. long offset;
  43. long ancho;       //nombro variables
  44. long alto;
  45. int planos;
  46. int bpp;
  47. long compresion;
  48. long tamanoBmpPixel;
  49. long NumColores;
  50. char tipo[1]; //Tipo BMP ( Microsoft,OS/2...)
  51.  
  52. tamano = 0;
  53. offset = 0;
  54. ancho = 0;       //inicializo variables para que no tomen valores extra¤os
  55. alto= 0;
  56. planos= 0;
  57. bpp= 0;
  58. compresion= 0;
  59. tamanoBmpPixel= 0;
  60. NumColores= 0;
  61.  
  62.  
  63. fseek(archivo,0L,SEEK_SET); //Tipo de bmp
  64.    fread(tipo,1,2,archivo);
  65.    printf("þ     Tipo de BMP   = %s n",tipo);
  66. //   rewind(archivo);
  67.  
  68. fseek(archivo,2L,SEEK_SET); //---tama¤o archivo bmp
  69.      fread(&tamano,1,4,archivo);
  70.      printf("þ     Tama¤o de BMP = %lu Bytesn",tamano);
  71.  
  72. fseek(archivo,10L,SEEK_SET); //----offset archivo
  73.      fread(&offset,1,4,archivo);
  74.      printf("þ     Offset BMP    = %d (Datos im gen empiezan en este byte)n",offset);
  75.  
  76.  
  77. fseek(archivo,18L,SEEK_SET); //----ancho archivo
  78.     fread(&ancho,1,4,archivo); //guardo en &ancho, 1 registro de 4 bytes.
  79.     printf("þ     Ancho de BMP  = %dn",ancho);
  80.  
  81. fseek(archivo,22L,SEEK_SET); //----alto bmp
  82.     fread(&alto,1,4,archivo);
  83.     printf("þ     Alto de BMP   = %dn",alto);
  84.  
  85. fseek(archivo,26L,SEEK_SET); //----numero de planos
  86.     fread(&planos,1,2,archivo);
  87.     printf("þ     Numero de planos BMP = %dn",planos);
  88.  
  89. fseek(archivo,28L,SEEK_SET); //----bit por pixel ( 256 colores 8 bit)
  90.     fread(&bpp,1,2,archivo);
  91.     printf("þ     Bit por pixel (BPP) = %dn",bpp);
  92.  
  93. fseek(archivo,30L,SEEK_SET); //----compresion archivo bmp
  94.     fread(&compresion,1,2,archivo);
  95.     printf("þ     ¨Existe compresi¢n? (0->NO) = %dn",compresion);
  96.  
  97. fseek(archivo,34L,SEEK_SET); //---cantidad en pixel
  98.     fread(&tamanoBmpPixel,1,4,archivo);
  99.     printf("þ     Tama¤o im gen %lu pixelesn",tamanoBmpPixel);
  100.  
  101. fseek(archivo,46L,SEEK_SET); //--- numero colores bmp
  102.     fread(&NumColores,1,4,archivo);
  103.     printf("þ     N£mero de colores de im gen %dn",NumColores);
  104.  
  105. cout << "n";
  106. cout << "PULSE UNA TECLA PARA MOSTRAR EL BMP EN PANTALLA";
  107. getch();
  108.  
  109. long  rojo,verde,azul,contador;
  110. long  dato,cuenta_colores;
  111. long  valorLetra;
  112. int   valor;    //con INT SALE MAS COLOR original CHAR
  113. int r,v,a,c;
  114. r = 0; v= 0; a= 0; c= 0;
  115. valor = 0;
  116. valorLetra = 0;
  117. cuenta_colores = 0;
  118. contador  =  0;
  119. dato      =  0;
  120.  
  121.     asm{
  122.       mov ah,0
  123.       mov al,13h
  124.       int 10h
  125.     }
  126.  
  127.  
  128.     fseek(archivo,54L,SEEK_SET); //--- numero colores bmp ( Cargo Paleta Colores )
  129.     do
  130.        {
  131.  
  132.         outportb(0x3c8,cuenta_colores);
  133.         fread(&valor,1,1,archivo);
  134.            valorLetra = valor;
  135.            azul = abs(valorLetra /4);   //falta poner valor ascii
  136.            valorLetra = 0;
  137.            a = azul;
  138.  
  139.         fread(&valor,1,1,archivo);
  140.           valorLetra = valor;
  141.           verde = abs(valorLetra/4 );
  142.           valorLetra = 0;
  143.           v = verde;
  144.  
  145.         fread(&valor,1,1,archivo);
  146.            valorLetra = valor;
  147.            rojo = abs(valorLetra/4 );
  148.            valorLetra = 0;
  149.            r = rojo;
  150.  
  151.         fread(&valor,1,1,archivo);
  152.         valorLetra = 0;
  153.         cuenta_colores = cuenta_colores + 1;
  154.  
  155.          outportb(0x3c9,r);
  156.          outportb(0x3c9,v);
  157.          outportb(0x3c9,a);
  158.         }
  159.  
  160.     while(cuenta_colores <= 255);
  161.     getch();
  162.  
  163.     do
  164.         {
  165.         fseek(archivo,1078L+contador,SEEK_SET);   //Aquí vuelvo a video memoria. Lo que quiero hacer es guardar esos datos en un array de 63779
  166.         fread(&dato,1,1,archivo);        //elementos y luego volcarlo a la video memoria, pero no se como hacerlo.
  167.         pokeb(0xa000,contador,dato); // Muestra en video memoria.
  168.         contador = contador + 1 ;
  169.         }
  170.     while (contador <=63779);
  171.  
  172.     getch();
  173.  
  174.      asm{
  175.     mov ah,0
  176.     mov al,02h          //vuelvo a pantalla modo texto
  177.     int 10h
  178.     }
  179.  
  180. return(0);
  181. }
  182.  
  183.  
  184.  

sergio__

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP
« Respuesta #1 en: Martes 28 de Junio de 2011, 19:13 »
0
HnoTpuedoTpegarPlink://es.kioskea.net/c ... t-bmp.php3

Leete eso, ahi te ayuda bastante porq tenes bien como es el formato del bmp, al principio esta toda la metadata, es mas facil levantar los structs, y despues pedir en el buffer memoria necesaria para la imagen en si

no te conviene leer del archivo de a 1 byte porq te lo hace muy ineficiente, el acceso a disco es lo que mas tarda

en el codigo que pusiste donde usas el farmalloc ,el farmalloc no lo use nunca yo, pero asumo que no debe ser muy distinto del malloc, no te esta andando porq vos definis un arreglo de 64000 bytes, pero tu arreglo es del tipo entero, cada entero son 4 bytes, es decir, cuando incrementas el indice en el arreglo avanzas de a 4 bytes, no de a uno, entonces llegas a pisar memoria no permitida

tendrias que hacer asi

int * arreglo =(int*) malloc(sizeof(int)*64000);  --> con esto allocas espacio para 64000 enteros, que es 64000*4 bytes
sino
char* arreglo= (char*)malloc(sizeof(char)*64000); --> con esto allocas espacio para 64000 chars, que como cada char pesa 1 byte son 64000bytes


creo que ese es tu error, no lo puedo probar aca porq no tengo un compilador de C en esta pc