Programación General > C/C++
Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP
(1/1)
TSW:
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++ --- #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>#include <alloc.h>#include <malloc.h>#include <mem.h> main(){ clrscr(); int far *array; array = (int far *) farmalloc(64000);do { array[contador] = 1; contador = contador + 1; }while(contador<=64000); }
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++ --- //BITMAP LOADER BY TSW 2011.//PROGRAMADOR : Gabriel González González//E-MAIL : gabrielgg85@gmail.com//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> informacion(); //subprograma cabecera main(){//SUBPROGRAMA INFORMACION clrscr(); cout << "BITMAP LOADER 1.0 BY TSWn"; char *fil = "c:\nuevo1.bmp"; //aquí la ruta de tu archivo, no olvides poner DOBLE BARRA \ ,te recomiendo ponerlo en c: raiz el archivo. 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 variableslong 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¤osalto= 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 Bytesn",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 = %dn",ancho); fseek(archivo,22L,SEEK_SET); //----alto bmp fread(&alto,1,4,archivo); printf("þ Alto de BMP = %dn",alto); fseek(archivo,26L,SEEK_SET); //----numero de planos fread(&planos,1,2,archivo); printf("þ Numero de planos BMP = %dn",planos); fseek(archivo,28L,SEEK_SET); //----bit por pixel ( 256 colores 8 bit) fread(&bpp,1,2,archivo); printf("þ Bit por pixel (BPP) = %dn",bpp); fseek(archivo,30L,SEEK_SET); //----compresion archivo bmp fread(&compresion,1,2,archivo); printf("þ ¨Existe compresi¢n? (0->NO) = %dn",compresion); fseek(archivo,34L,SEEK_SET); //---cantidad en pixel fread(&tamanoBmpPixel,1,4,archivo); printf("þ Tama¤o im gen %lu pixelesn",tamanoBmpPixel); fseek(archivo,46L,SEEK_SET); //--- numero colores bmp fread(&NumColores,1,4,archivo); printf("þ N£mero de colores de im gen %dn",NumColores); cout << "n";cout << "PULSE UNA TECLA PARA MOSTRAR EL BMP EN PANTALLA";getch(); long rojo,verde,azul,contador;long dato,cuenta_colores;long valorLetra;int valor; //con INT SALE MAS COLOR original CHARint 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 ( Cargo Paleta Colores ) 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(); do { fseek(archivo,1078L+contador,SEEK_SET); //Aquí vuelvo a video memoria. Lo que quiero hacer es guardar esos datos en un array de 63779 fread(&dato,1,1,archivo); //elementos y luego volcarlo a la video memoria, pero no se como hacerlo. pokeb(0xa000,contador,dato); // Muestra en video memoria. contador = contador + 1 ; } while (contador <=63779); getch(); asm{ mov ah,0 mov al,02h //vuelvo a pantalla modo texto int 10h } return(0);}
sergio__:
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
Navegación
Ir a la versión completa