• Domingo 22 de Diciembre de 2024, 17:43

Autor Tema:  Formato Bmp  (Leído 60778 veces)

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Formato Bmp
« Respuesta #100 en: Domingo 16 de Julio de 2006, 14:24 »
0
Hola!

Citar
Como habran observado aquellas personas que les sucedia que la imagen de dibujaba mal(como pixeles agitados por el viento), el ancho de la imagen o, el alto de la misma, termina en nùmero impar.

Mi codigo no hace ningun tipo de tratamiento especial con la altura de la imagen (con el ancho si, pero eso ya está más que hablado...), y se pintan todas las que he probado bien (una de ellas de 1001 x 747).  :blink:

Citar
bitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);

Por lo que parece, lo que hace es alinear a bytes el numero de bits por pixel para ver cuantos hay que leer, no?? De todas formas, ¿donde va exactamente el parentesis que falta?  :alien:

Un saludo!!  :hola:
   

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Formato Bmp
« Respuesta #101 en: Domingo 16 de Julio de 2006, 14:57 »
0
Cita de: "Nagisa"
Citar
bitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);

De todas formas, ¿donde va exactamente el parentesis que falta?  :alien:
al parecer sobra el primero.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Danielo

  • Miembro activo
  • **
  • Mensajes: 69
    • Ver Perfil
Re: Formato Bmp
« Respuesta #102 en: Lunes 17 de Julio de 2006, 16:32 »
0
Estoy teniendo problemas con la matriz de colores que la definí de la siguiente manera:
Código: Text
  1. struct TMatriz{
  2.           COLORREF **coords;
  3.           int maxX,maxY;
  4.        };
  5.  
... porque como estoy utilizando SetPixel, que tiene la sintaxis:
Código: Text
  1. COLORREF SetPixel(
  2.     HDC hdc,          // manipulador a contexto de dispositivo
  3.     int X,            // coordenada x del pixel
  4.     int Y,            // coordenada x del pixel
  5.     COLORREF crColor  // color del pixel
  6.    );
  7.  
... el programa no logra mostrar el bmp en pantalla, supongo que sera porque la estructura de COLORREF almacena un valor de 32 bits y en el caso del bmp al tener una matriz de COLORREF la memoria se desborda... lo extraño es que no me sale ningún mensaje de error, simplemente ejecuto el programa y no aparece ni la ventana.

Lo que se me ocurrió entonces fue cambiar COLORREF por unsigned char, o sea:
Código: Text
  1. struct TMatriz{
  2.           unsigned char **coords;
  3.           int maxX,maxY;
  4.        };
  5.  

y ahora lo que esta pasando es que la imagen se carga en la ventana, pero se esta viendo en color rojo y negro, evidentemente estoy manejando mal los colores RGB, no se si existira alguna forma de convertir un unsigned char a COLORREF o si tendre que hacer una función que haga eso.

La parte de obtener el cabezal y la información del cabezal del archivo bmp está funcionando bien, también he intentado con SetPixelV como me sugirió inforsystem y tampoco me dio resultado.
Recuerda siempre que eres único... Exactamente igual que todos los demás.
No existen frases de seis palabras.
Seamos realistas. Busquemos lo imposible.
Lo difícil tarda un poco en resolverse, lo imposible un poco más.

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Formato Bmp
« Respuesta #103 en: Lunes 17 de Julio de 2006, 17:40 »
0
Hola:

A mi me pasaba algo asi al principio. No se si sera lo mismo, pero fue que me tratataba los bytes que leia como con signo. Asi por ejemplo, si leia 0xFF, me lo trataba como un -1 en lugar de un 255. Quizas por eso cuando pones unsigned char te vaya bien.

Lo malo es que yo lo tengo en Java y todos los tipos tienen signo T__T, asi que me costo bastante solucionarlo...

Saludos!!
   

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Formato Bmp
« Respuesta #104 en: Lunes 17 de Julio de 2006, 18:39 »
0
Cita de: "Danielo"
Estoy teniendo problemas con la matriz de colores que la definí de la siguiente manera:
Código: Text
  1. struct TMatriz{
  2.           COLORREF **coords;
  3.           int maxX,maxY;
  4.        };
  5.  
... porque como estoy utilizando SetPixel, que tiene la sintaxis:
Código: Text
  1. COLORREF SetPixel(
  2.     HDC hdc,          // manipulador a contexto de dispositivo
  3.     int X,            // coordenada x del pixel
  4.     int Y,            // coordenada x del pixel
  5.     COLORREF crColor  // color del pixel
  6.    );
  7.  
... el programa no logra mostrar el bmp en pantalla, supongo que sera porque la estructura de COLORREF almacena un valor de 32 bits y en el caso del bmp al tener una matriz de COLORREF la memoria se desborda... lo extraño es que no me sale ningún mensaje de error, simplemente ejecuto el programa y no aparece ni la ventana.

Lo que se me ocurrió entonces fue cambiar COLORREF por unsigned char, o sea:
Código: Text
  1. struct TMatriz{
  2.           unsigned char **coords;
  3.           int maxX,maxY;
  4.        };
  5.  

y ahora lo que esta pasando es que la imagen se carga en la ventana, pero se esta viendo en color rojo y negro, evidentemente estoy manejando mal los colores RGB, no se si existira alguna forma de convertir un unsigned char a COLORREF o si tendre que hacer una función que haga eso.

La parte de obtener el cabezal y la información del cabezal del archivo bmp está funcionando bien, también he intentado con SetPixelV como me sugirió inforsystem y tampoco me dio resultado.
¿Y cómo realizas la lectura de tu matriz de colores?
Si lees directo hacia COLORREF, recuerda que es un DWORD y la información de colores en el archivo está en 3 bytes, no sé si por allí sea el problema.

http://msdn.microsoft.com/library/default....colors_8bvm.asp

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Formato Bmp
« Respuesta #105 en: Lunes 17 de Julio de 2006, 23:10 »
0
A mi me parecio mucho mas facil leer byte a byte, aunque que el alineado sea a 32 bits te inita a que leas por palabras...
   

Danielo

  • Miembro activo
  • **
  • Mensajes: 69
    • Ver Perfil
Re: Formato Bmp
« Respuesta #106 en: Martes 18 de Julio de 2006, 02:36 »
0
Gracias Geo y Nagisa...

He logrado disminuir un poco (al menos por el momento) el problema cambiando la estructura de la matriz de bits, porque por lo visto la que estaba utilizando:
Código: Text
  1. struct TMatriz{
  2.          COLORREF **coords;
  3.          int maxX,maxY;
  4.       };
  5.  
en el momento de crearla consumía mucha memoria y se desbordaba. Asi que de no muy buena gana ahora estoy con una matriz estática:
Código: Text
  1. DWORD matriz[MAXLARGO][MAXANCHO*3];
  2.  
y ahora al menos puedo cargar el bmp en pantalla, pero sigo teniendo el problema de que cuando lo muestro se ve en rojo y negro.
Citar
¿Y cómo realizas la lectura de tu matriz de colores?
Todo esta apuntando a que no estoy leyendo bien la matriz, pero no logro darme cuenta, el código lo he escrito según lo que he leido y he entendido en este foro y lo adjunto, en una de esas alguien ve algo que yo no veo:
Código: Text
  1. int alto=getAltoBitmap(bmp);
  2.  int ancho=getAnchoBitmap(bmp);
  3.  int x,y;
  4.  DWORD tmpByte;
  5.  
  6.  int bytesRelleno = (bool)((getAnchoBitmap(bmp)*3) % 4) * (4 - ((getAnchoBitmap(bmp)*3) % 4));
  7.  fseek(arch, getNumBytesHastaPixel(bmp), SEEK_SET);
  8.  for(y=alto; y > 0; y--) {
  9.    for(x = 0; x < ancho*3; x++)    
  10.     cargarMatrizBMP(y-1,x,fgetc(arch),bmp);
  11.     for(x = 0; x < bytesRelleno; x++)
  12.             tmpByte = fgetc(arch);
  13.    
  14.  }
  15.  

... y la función CargarMatrizBMP:
Código: Text
  1. void cargarMatrizBMP(int x,int y, DWORD valor,imagenBMP *bmp){
  2.   bmp->matriz[x][y]=valor;
  3. }
  4.  
Recuerda siempre que eres único... Exactamente igual que todos los demás.
No existen frases de seis palabras.
Seamos realistas. Busquemos lo imposible.
Lo difícil tarda un poco en resolverse, lo imposible un poco más.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Formato Bmp
« Respuesta #107 en: Martes 18 de Julio de 2006, 06:00 »
0
El primer ciclo for es muy probable que te cause problemas, pues si tu matriz es [alto][ancho], el indice de la última fila es alto - 1, y tú estás tratando de acceder a la última fila con el índice alto.
Código: Text
  1.  
  2.  for(y=alto; y > 0; y--) {
  3.   for(x = 0; x < ancho*3; x++)    
  4.    cargarMatrizBMP(y-1,x,fgetc(arch),bmp);
  5.    for(x = 0; x < bytesRelleno; x++)
  6.            tmpByte = fgetc(arch);
  7.    
  8. }
  9.  
  10.  

Como lo pones, me parece que estás guardando cada componente de color (1 byte) en un COLORREF (dword, 4 bytes), lo cual me parece un desperdicio pues bien podrías guardar las tres componentes de un pixel en un COLORREF.

Porque, ahora habría que ver cómo estás pintando la matriz al HDC :P. Lo más probable es que estés pintando solo rojo porque sólo estás estableciendo la componente roja de tus COLORREF :).

Tal como está tu código, creo que tu matriz podría ser de unsigned chars[ alto ] [ ancho * 3 ] y pintarla así:

Código: Text
  1.  
  2. unsigned char azul;
  3. unsigned char verde;
  4. unsigned char rojo;
  5. COLORREF color;
  6. for ( y = 0; y < alto; y++ ) {
  7.   for( x = 0; x < ancho; x++ ) {
  8.     azul    = matriz[ y ] [ x * 3 ];
  9.     verde = matriz[ y ] [ x * 3 + 1 ];
  10.     rojo    = matriz[ y ] [ x * 3 + 2 ];
  11.     color = RGB( rojo, verde, azul );
  12.     SetRGB( hdc, x, y, color );
  13.   }
  14. }
  15.  
  16.  

Otra opción podría ser que tu matriz fuera de COLORREF[ alto ][ ancho ] y llenarla con algo como esto:

Código: Text
  1.  
  2.   unsigned char azul;
  3.   unsigned char verde;
  4.   unsigned char rojo;
  5.   for ( y = alto - 1; y >= 0; y-- ) {
  6.     for ( x = 0; x < ancho; x++ ) {
  7.       // Por cada punto leemos tres bytes (las tres componentes BGR)
  8.       azul = fgetc( arch );
  9.       verde = fgetc( arch );
  10.       rojo = fgetc( arch );
  11.       matriz[ y ][ x ] = RGB( rojo, verde, azul );
  12.     }
  13.     // Para cada línea saltamos los bytes de relleno
  14.     for ( z = 0; z < bytesRelleno; z++ ) {
  15.       tmpByte = fgetc( arch );
  16.     }
  17.   }
  18.  
  19.  

Así, guardas cada pixel (las tres componentes, 3 bytes) en un solo COLORREF que luego podrías pintar más fácilmente :).

Código: Text
  1.  
  2. for ( y = 0...
  3.   for ( x = 0; x < ancho; x++ )
  4.     SetPixel( hdc, x, y, matriz[ y ][ x ];
  5.  
  6.  
  7.  

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

inforsystem

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Formato Bmp
« Respuesta #108 en: Miércoles 19 de Julio de 2006, 04:29 »
0
Cita de: "Nagisa"
Citar
bitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);

Por lo que parece, lo que hace es alinear a bytes el numero de bits por pixel para ver cuantos hay que leer, no?? De todas formas, ¿donde va exactamente el parentesis que falta?  :alien:
 
Hola
Perdon por el error, la funcion es asi:

bitsize = (ancho_imagen) * ((bpp + 7) / 8) * abs(alto_imagen);

Pero eso no es todo, me olvide de decirles cuando se debe utilizar:

Cuando la variable bmiSizeImage de la estructura BITMAPINFOHEADER es igual a 0(cero).

Esto es utilil cuando quieren guardar una imagen al disco.

 if((bitsize = (*info)->header.bmiSizeImage) == 0)
 {
     bitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);
 };
Lamento no participar, pero mi "maquina" esta a 148km de distancia :huh: , por eso  tambien debo pedir disculpas por mis errores, pero aveces mi memoria me falla( como seguro podran observar en el codigo que les di ahora :hola: )

Tengo el codigo(lapiz y papel) para imprimir los mapas de bits y para guardarlo al disco.No lo publico porque no se si lo quieren realizar en un nuevo reto...
Saludos a todos y tratare de no participar tanto si no estoy bien seguro de la teoria al menos. :hola:

inforsystem

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Formato Bmp
« Respuesta #109 en: Miércoles 19 de Julio de 2006, 05:30 »
0
Cita de: "Nagisa"
A mi me parecio mucho mas facil leer byte a byte, aunque que el alineado sea a 32 bits te inita a que leas por palabras...
Hola.
Si utilizas la funcion fread, no creo que leer byte a byte sea lo mas optimo.
La estructura de un archivo bmp(puede que lo sepas) es asi:

----BITMAPINFOHEADER---
----BITMAPINFO-------------
----MAPA DE BITS----------

Para cuando el "cursor" de posicion este en el final de la estructura BITMAPINFO ya tienes suficientes datos para leer el contenido completo del  mapa de bits.

VOID *bits;
...
bits = (VOID*) malloc(bitsize);
fread(bits,1,bitsize,fp);           //Se lee de una vez
...

No crees que es más optimo cargar a memoria y luego leer los datos de ahi, que hacer sucesibas peticiones de lectura al disco?
Saludos

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Formato Bmp
« Respuesta #110 en: Miércoles 19 de Julio de 2006, 17:25 »
0
Hola anoche en un rato libre, se me ocurrio usar ese tiempo para sacar este programa, pero cuando leia sobre la estructura de los BMP 24 bits, me hice bolas con lo siguiente.

Los colores de la imagen estan a partir del 55° Byte.
Los pixels se leen de izquierda a derecha y luego de abajo a arriba
55, 56, 57 son B, G, R.

Entonces si yo tengo un dibujo de 5 x 5

Los byte 55, 56, y 57

Son el pixel (0, 0)

12345
12345
12345
12345
1<---Este---2345

en creo que en BitMap de VS.Net seria la posicion (0,4)

 :blink:
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Formato Bmp
« Respuesta #111 en: Miércoles 19 de Julio de 2006, 17:34 »
0
Cita de: "senzao18"
Los colores de la imagen estan a partir del 15° Byte.
 
No te fies de eso, mejor revisa el campo offset, este te dice en que posicion empieza la informacion del bmp.

Repecto al orden de los colores, asumiendo que cada numero representa un color, en el caso de un bmp de 5*5 serian:


Código: Text
  1. 21,22,23,24,25
  2. 16,17,18,19,20
  3. 11,12,13,14,15
  4. 06,07,08,09,10
  5. 01,02,03,04,05
  6.  

como cada color es de tres componentes, vienen si mal no recuerdo:


Código: Text
  1. (RGB), (RGB), (RGB), (RGB), (RGB)
  2. (RGB), (RGB), (RGB), (RGB), (RGB)
  3. (RGB), (RGB), (RGB), (RGB), (RGB)
  4. (RGB), (RGB), (RGB), (RGB), (RGB)
  5. (RGB), (RGB), (RGB), (RGB), (RGB)
  6.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Formato Bmp
« Respuesta #112 en: Miércoles 19 de Julio de 2006, 18:43 »
0
Tiene razón Juank, aunque hasta ahora todos los bitmap de 24 bits que he encontrado empiezan en ese byte (las cabeceras son siempre de 54 bytes).

Sólo algunos detalles que recordar:
  • Las componentes están en orden BGR (azul, verde, rojo).</li>
  • La imagen normalmente está "de cabeza", es decir, la última fila de información en el archivo es en realidad la línea superior de la imagen. Según la documentación que leí, esto lo determina el signo de la altura de imagen (dato leído del archivo), si la altura es negativa, la info de imagen está "bien", si la altura es positiva, la imagen está "de cabeza" y hay que invertirla. Aquí, comento que tampoco he encontrado una imagen en la que la altura sea negativa, y cuando yo intenté guardar una imagen así, no la pude ver en algunos programas :P.</li>
  • Cuando una línea no tiene un número de bytes divisible entre 4, tiene bytes "de relleno", en el caso de la imagen 5x5 que mencionas, la info de imagen en el archivo estaría así:
    Citar
    BGRBGRBGRBGRBGRU
    BGRBGRBGRBGRBGRU
    BGRBGRBGRBGRBGRU
    BGRBGRBGRBGRBGRU
    BGRBGRBGRBGRBGRU
    Cada letra es un byte, B, G y R representan componentes de color, y U es un byte de relleno para que la línea tenga un número de bytes múltiplo de 4 (16, en este caso).</li>
Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Formato Bmp
« Respuesta #113 en: Miércoles 19 de Julio de 2006, 18:43 »
0
Cita de: "inforsystem"
Cita de: "Nagisa"
A mi me parecio mucho mas facil leer byte a byte, aunque que el alineado sea a 32 bits te inita a que leas por palabras...
Hola.
Si utilizas la funcion fread, no creo que leer byte a byte sea lo mas optimo.
La estructura de un archivo bmp(puede que lo sepas) es asi:

----BITMAPINFOHEADER---
----BITMAPINFO-------------
----MAPA DE BITS----------

Para cuando el "cursor" de posicion este en el final de la estructura BITMAPINFO ya tienes suficientes datos para leer el contenido completo del  mapa de bits.

VOID *bits;
...
bits = (VOID*) malloc(bitsize);
fread(bits,1,bitsize,fp);           //Se lee de una vez
...

No crees que es más optimo cargar a memoria y luego leer los datos de ahi, que hacer sucesibas peticiones de lectura al disco?
Saludos
Hola:

De hecho al final lo lei todo de una vez... A mi tambien me parecio mas optima una sola peticion de lectura :D

Saludos!
   

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Formato Bmp
« Respuesta #114 en: Miércoles 19 de Julio de 2006, 19:20 »
0
Pues no me sale :(....

Yo estoy leyendo Byte por Byte... en la posicion que el offset e inicio a pintarlo pero me sale la imagen rara,,

ahi se las adjunto :D.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Formato Bmp
« Respuesta #115 en: Miércoles 19 de Julio de 2006, 20:38 »
0
segun se ve en las imagenes , pareciera que no estas usando el padding, o bien que lo estas haciendo mal.

Revisa los comentarios que se han dado al respecto del tema.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Formato Bmp
« Respuesta #116 en: Miércoles 19 de Julio de 2006, 20:42 »
0
Cita de: "Nagisa"

De hecho al final lo lei todo de una vez... A mi tambien me parecio mas optima una sola peticion de lectura :D

Saludos!
Pero aun no me has enviado tus fuentes actualizados.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Formato Bmp
« Respuesta #117 en: Miércoles 19 de Julio de 2006, 21:56 »
0
Bueno el fin de semana veo lo de  padding.

Lei todos los post al respecto pero me hice bolas el sabado con mas calma los leo.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

Danielo

  • Miembro activo
  • **
  • Mensajes: 69
    • Ver Perfil
Re: Formato Bmp
« Respuesta #118 en: Jueves 20 de Julio de 2006, 03:59 »
0
Cita de: "Geo"
Como lo pones, me parece que estás guardando cada componente de color (1 byte) en un COLORREF (dword, 4 bytes), lo cual me parece un desperdicio pues bien podrías guardar las tres componentes de un pixel en un COLORREF.

Porque, ahora habría que ver cómo estás pintando la matriz al HDC :P. Lo más probable es que estés pintando solo rojo porque sólo estás estableciendo la componente roja de tus COLORREF :).
Gracias Geo!!... ahora siiiii!!! los bitmaps aparecen con todos sus colores!!  :bravo:

Efectivamente, entre otras cosas eso es exactamente lo que estaba pasando, gracias a tu buena explicación ahora lo veo claramente.
Lo que yo intentaba era capturar cada pixel (azul, verde, rojo) como un unsigned char y como no sabía de la existencia de la funcion RGB(r,v,a) muy ingenuamente esperaba que el fgetc hiciera todo el proceso de conversión, por supuesto, no me parecía nada coherente, pero era lo único que tenía  :(

Para terminar el reto, ahora me esta faltando resolver la parte de cargar cualquier bitmap, asi que ya estoy poniendo manos a la obra y en una de esas tengo todo pronto para el finde  :D
Recuerda siempre que eres único... Exactamente igual que todos los demás.
No existen frases de seis palabras.
Seamos realistas. Busquemos lo imposible.
Lo difícil tarda un poco en resolverse, lo imposible un poco más.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Formato Bmp
« Respuesta #119 en: Jueves 20 de Julio de 2006, 04:33 »
0
Cita de: "Danielo"
Para terminar el reto, ahora me esta faltando resolver la parte de cargar cualquier bitmap, asi que ya estoy poniendo manos a la obra y en una de esas tengo todo pronto para el finde  :D
 :lol: que buena noticia!!! :D
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Formato Bmp
« Respuesta #120 en: Jueves 20 de Julio de 2006, 07:39 »
0
He resuelto lo del padding despues de tanto buscar en internet jejee

Mi error fue que leia los byte del padding despues de cada pixel y se leen despues de cada linea horizontal. bueno asi me salio a mi jeje...

ahora el problema que tengo es con el ancho y alto de la imagen

por ejemplo cuandpo leo los 3 bytes del ancho tengo lo siguiente:
70, 0 ,0 Aqui no hayproblema el ancho es de 70...

Pero cuando me regresa
70, 2, 0 Ahi si no se como se calcula el ancho...... Alguna idea de como se calcula???

Imagino que ustedes leen los 3 byte en una variable de un tipo que soporte los tres byte y no en un arreglo y al leerlo ya les da el ancho sin tener que calcular pero pues yo leo 3 bytes en un arreglo y no tengo idea de como se calcula :(.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Formato Bmp
« Respuesta #121 en: Jueves 20 de Julio de 2006, 08:23 »
0
Cita de: "senzao18"
Mi error fue que leia los byte del padding despues de cada pixel y se leen despues de cada linea horizontal. bueno asi me salio a mi jeje...
 
asi es.. de eso hemos hablado en casi todo el thread  :P

Citar
por ejemplo cuandpo leo los 3 bytes del ancho tengo lo siguiente:
70, 0 ,0 Aqui no hayproblema el ancho es de 70...

Pero cuando me regresa
70, 2, 0 Ahi si no se como se calcula el ancho...... Alguna idea de como se calcula???

Imagino que ustedes leen los 3 byte en una variable de un tipo que soporte los tres byte y no en un arreglo y al leerlo ya les da el ancho sin tener que calcular pero pues yo leo 3 bytes en un arreglo y no tengo idea de como se calcula

No te lies, el ancho es un entero de 4 bytes, asi que nada mas lee los cuatro bytes del archivo en una variable entera, sino sabes como hacerlo con la tecnica que usas de byte a byte sirve pero debes hacer operaciones binarias para convertir los 4 bytes en nun int utilizando corrimientos de bytes y/o operadores | &
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Formato Bmp
« Respuesta #122 en: Jueves 20 de Julio de 2006, 14:13 »
0
Citar
He resuelto lo del padding despues de tanto buscar en internet jejee
Acaso nadie lee los posts del thread? :devil:

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Formato Bmp
« Respuesta #123 en: Jueves 20 de Julio de 2006, 17:08 »
0
Si los lei todos por recomendacion de JuanK, pero la verdad fue en horas de trabajo asi que los lei a la carrera jaja. Y me hice bolas. :P.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Formato Bmp
« Respuesta #124 en: Jueves 20 de Julio de 2006, 17:43 »
0
Cita de: "senzao18"
He resuelto lo del padding despues de tanto buscar en internet jejee

Mi error fue que leia los byte del padding despues de cada pixel y se leen despues de cada linea horizontal. bueno asi me salio a mi jeje...

ahora el problema que tengo es con el ancho y alto de la imagen

por ejemplo cuandpo leo los 3 bytes del ancho tengo lo siguiente:
70, 0 ,0 Aqui no hayproblema el ancho es de 70...

Pero cuando me regresa
70, 2, 0 Ahi si no se como se calcula el ancho...... Alguna idea de como se calcula???

Imagino que ustedes leen los 3 byte en una variable de un tipo que soporte los tres byte y no en un arreglo y al leerlo ya les da el ancho sin tener que calcular pero pues yo leo 3 bytes en un arreglo y no tengo idea de como se calcula :(.
Como dice Juank, el ancho es un entero de 4 bytes (un DWORD en la WinAPI), si usas fread puedes fácilmente leer esos 4 bytes en una sola operación de lectura. Si lo estás haciendo byte a byte, toma los 4 bytes y únelos con algo como:
Código: Text
  1.  
  2. DWORD hiword = 0xaabb;
  3. DWORD loword = 0xccdd;
  4.  
  5. DWORD resultado = ( hiword &#60;&#60; 16 ) + loword;
  6.  
  7. // resultado = 0xaabbccdd;
  8.  
  9.  
Aquí lo hice con dos variables de 2 bytes, se "unen" para formar una de 4 bytes, puedes hacer algo similar con los 4 bytes que lees del archivo y representan el ancho de la imagen.

Una cosa, ¿con qué lenguaje estás trabajando :D?

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip