hola, quizá mi pregunta suene extraña, pero es que lo necesito porque se me ocurrió investigar cómo leer bmp e hice mi código, sin embargo me encontré con esto:
Quotey porque cada scanline de data esta alineada a 32 bits, asi que si no respeta cant_bytes_scan_line%4=0, tenes q leer un poco mas de "mierda" (1 o 2 o 3 bytes) para que quede alineado...
y me pasó en el primer gráfico que cargué, sin embargo con el segundo ya no pasa y necesito saber cuántos bytes saltarme, o al menos cuántos hay por linea, y no se me ocurre, por el momento, cómo hacerlo
aqui tengo el código si necesitan verlo:
[code language="bennu"]
import "mod_text";
import "mod_grproc";
import "mod_proc";
import "mod_video";
import "mod_map";
import "mod_screen";
import "mod_key";
import "mod_wm";
import "mod_file";
import "mod_say";
import "mod_string";
import "mod_dir";
import "mod_debug";
import "mod_map";
import "mod_draw";
private
lect;
lect2;
byte ar[800];
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
begin
set_mode(800,700,32);
lect=fopen("bennu.bmp",o_read);
lect2=fopen("bennu.txt",o_write);
//fgets(lect);
ar[1]=fread(lect,bfType);
write(0,100,100,4,bfType);
ar[1]=fread(lect,bfSize);
write(0,100,150,4,bfSize);
ar[1]=fread(lect,bfReserved1);
write(0,100,200,4,bfReserved1);
ar[1]=fread(lect,bfReserved2);
write(0,100,250,4,bfReserved2);
ar[1]=fread(lect,bfOffBits);
write(0,100,300,4,bfOffBits);
ar[1]=fread(lect,biSize);
write(0,100,350,4,biSize);
ar[1]=fread(lect,biWidth);
write(0,100,400,4,biWidth);
ar[1]=fread(lect,biHeight);
write(0,100,450,4,biHeight);
ar[1]=fread(lect,biPlanes);
write(0,100,500,4,biPlanes);
ar[1]=fread(lect,biBitCount);
write(0,100,550,4,biBitCount);
ar[1]=fread(lect,biCompression);
write(0,200,100,4,biCompression);
ar[1]=fread(lect,biSizeImage);
write(0,200,150,4,biSizeImage);
ar[1]=fread(lect,biXPelsPerMeter);
write(0,200,200,4,biXPelsPerMeter);
ar[1]=fread(lect,biYPelsPerMeter);
write(0,200,250,4,biYPelsPerMeter);
ar[1]=fread(lect,biClrUsed);
write(0,200,300,4,biClrUsed);
ar[1]=fread(lect,biClrImportant);
write(0,200,350,4,biClrImportant);
graph=new_map(biWidth,biHeight,32);
y=biHeight;
x=0;
/*ar[1]=fread(lect,ar[0]);
ar[1]=fread(lect,ar[0]);
ar[1]=fread(lect,ar[0]);*/
repeat
x++;
if (x>biWidth)
x=1; y--;
ar[1]=fread(lect,ar[0]);
ar[1]=fread(lect,ar[0]);
end
ar[1]=fread(lect,ar[0]);
ar[1]=fread(lect,ar[2]);
ar[1]=fread(lect,ar[3]);
map_put_pixel(0,graph,x,y,rgb(ar[3],ar[2],ar[0]));
until (y<1)
fclose(lect);
fclose(lect2);
x=400; y=350;
while (scan_code==0)
frame;
end
end[/code]
abajo hay 2 imagenes de prueba y el codigogracias
eh borrado las descargas, para no ocupar espacio en el foro :)
:D hola, ya resolví mi problema, de cualquier forma muchísimas gracias. :)
Aunque lo tienes solucionado por ti mismo, haciendo referencia a el Título del Tema, el Help dice:
DWORD FTELL(INT fichero)
Esta función devuelve la posición del puntero de lectura/escritura de un fichero abierto con la función FOPEN, siempre respecto al origen del fichero (0 para indicar el comienzo).
DWORD FEOF(INT fichero)
Esta función devuelve 1 si el puntero de lectura/escritura se encuentra al final de un fichero abierto con la función FOPEN, o 0 en caso contrario. Puede usarse en un bucle que emplee FREAD para leer datos de un fichero, hasta que ya no queden más en el mismo.
DWORD FSEEK(INT fichero, INT posición, INT referencia)
Cambia la posición de un puntero de lectura/escritura en un fichero basándose en una referencia.
La referencia puede ser una de las siguientes constantes:
SEEK_CUR Posición actual del puntero en el fichero.
SEEK_END Posición final del fichero.
SEEK_SET Posición inicial del fichero.
La nueva posición puede venir dada a partir del comienzo del fichero (un número mayor o igual a 0), a partir de la posición actual (un número positivo o negativo) o a partir del final del mismo (un número negativo o 0). En todo caso, la posición se ajustará en función del tamaño actual del fichero, y se devolverá la nueva posición real, siempre respecto al origen del fichero.
:) gracias por el dato. y aprovechando, cuando leo con fread, si quiero leer bit a bit, exste algún tipo de dato que sea de un bit (boolean o algo así), o necesito leer byte a byte y luego descomponerlo en binario con los mod (%)?
hay alguna función para transformar de binario a decimal y viceversa?
gracias por la información amigo tyco:)
Si mal no me equivoco, el byte es el dato mas pequeño que puede ser leido en un fichero, por lo menos en Bennu/fenix/div.
Exacto tienes que leer byte a byte el fichero, y luego montarte una funcion que te pase los datos en tipo byte a una representacion en binario. puedes utilizar el sistema de descomposicion del numero a base de mod (%), o puedes utilizar el sistema mediante mascaras de bits, hay mas formas de hacerlo pero a estas horas de la noche el cerebro se me niega a pensar.
bytes... la unidad minima direccionable es el byte...
para acceder bit a bit dentro de un byte tenes que usar operadores bitwise
ya veo, gracias.
¿los operadores bitwise se manejan como si fuera c?, para investigar en c
si, son bor, bxor, band, bnot... o |, ^, & y ~