Domingo 15 de Diciembre de 2024, 21:48
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP (Leído 2047 veces)
TSW
Nuevo Miembro
Mensajes: 3
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++
#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:
\n
uevo1.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 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 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 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 ( 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
)
;
}
Tweet
sergio__
Nuevo Miembro
Mensajes: 12
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
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Cómo doble Buffer?,aquí tengo mi codigo para cargar un BMP