SoloCodigo

Asuntos Oficiales => Retos => Mensaje iniciado por: JuanK en Sábado 8 de Julio de 2006, 06:12

Título: Formato Bmp
Publicado por: JuanK en Sábado 8 de Julio de 2006, 06:12
Saludos, de acuerdo a las recientes discusiones se ha deccidido iniciar este nuevo reto, espero contar con la participacion activa de todos y asi sacarle el mejor provecho posible.

Formato BMP 24[/size]



Entrada:

El aplicativo debe solicitar por cualquier medio la ruta y nombre de un archivo BMP de 24 bits.  :lol: (limite el alcance para facilidad de muchos)

Salida:Condiciones:
Lenguajes permitidosPlataformas: Windows de 32 bit, linux de 32 bit ( se debe asegurar que la pieza de sw corra en cualquier distro)

Librerias/componentes graficos adicionales permitidas: DirectX, allegro, openGL, GDI+, java2d y en general cualquier otra, previa notificacion en el thread.

Modos de programa aceptados: Aplicaciones de 32 bit unicamente ( no DOS ni similares)

Requisito minimo de estructura: El programa independientemente del lenguaje en el cual sea escrito, debe constar de como minimo estos tres modulos:Los cuales deben ser claramente diferenciables entre si. Se debe procurar al maximo la independencia de estos componentes para que sean en alguna medida reutilizables.


Presentacion al usuario:Restricciones en el uso de librerias o componentes:Criterios a evaluar: :smartass: Con que se cumplan estas dos ya el reto esta resuelto sin embargo como espero que exista mas de una persona capaz de terminarlo tambien podremos discutir y comentar acerca de:Entregables:Intercambio de informacion

Es totalmente permitido dentro del thread, eso si cada cual sea cuidadoso, la idea es que a nadie le salga gratis y que desde luego no terminemos el reto con 2 o mas soluciones iguales o demasiado parecidas  :scream: .


Hecho!!! eso es todo, asi que manos a la obra, las personas que vayan a participar por favor notificarlo colocando un post en este mismo thread.

Manos a la obra!!!.  :comp:
Título: Re: Formato Bmp
Publicado por: Diodo en Sábado 8 de Julio de 2006, 09:10
Hola

Como no tengo mucho que hacer este fin de semana me voy a apuntar al reto  :smartass:  Entre tanto programador profesional quedare como el culo pero bueno como suelen decir lo importante es participar ...  :blink:

Tengo 2 dudas JuanK:

- ¿Duracion del reto?

- Si el BMP supera la resolucion de pantalla, hay que hacerle un escalado?? o esto se sale de la propuesta del reto y solamente hay que cargar BMPs que cojan en la resolucion de pantalla??

Un saludo y suerte para todos  :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 8 de Julio de 2006, 10:11
Citar
- ¿Duracion del reto?

Provisionalmente indefinido, a medida que vayan participando pueden sugerir una fecha de finalizacion de comun acuerdo.

Citar
- Si el BMP supera la resolucion de pantalla, hay que hacerle un escalado?? o esto se sale de la propuesta del reto y solamente hay que cargar BMPs que cojan en la resolucion de pantalla??

Fuera del alcance del reto, cada cual debe manejarlo como quiera, pero desde luego eso no debe producir fallos en la aplicacion.
Título: Re: Formato Bmp
Publicado por: Danielo en Sábado 8 de Julio de 2006, 19:38
Yo también me apunto al reto  :kicking:

Más que participar me entusiasma aprender algo nuevo, ya que por ejemplo hasta ahora nunca he tenido que realizar una aplicación GUI basada en ventanas.

Los lenguajes que conozco son C/C++, java y VB6, pero me gustaría utilizar C++, he utilizado CygWin y DevCpp, pero siempre en programas tipo consola (no GUI), asi que agradecería que me recomendaran que utilizar para programar con ventanas, supongo que podría ser Allegro, pero antes de sumergirme en esa librería me gustaría conocer vuestra opinión, o sea complejidad de uso y esas cosas.

 :suerte:
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 8 de Julio de 2006, 21:04
si lo que quieres es aprender algo de GUI no uses allegro, recomendacion:

java
.NET

si quieres C++ tambien.
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 8 de Julio de 2006, 21:13
Yo no puedo conscursar, porque no se debe ser Juez y Parte  :(   :ph34r: .

Sin embargo hare el ejercicio y lo entregare como cualquiera de los demas concursantes.

Yo ya he iniciado :lol:

(http://pwp.etb.net.co/juancarlosruiz/AppPreview.JPG)

Decidi hacerlo con C#  en modo de ventana, no me he decidido si usar DirectX o GDI+ o alguna otra.
Apenas tengo hecha la interfaz grafica que creo que usare.
Título: Re: Formato Bmp
Publicado por: Geo en Sábado 8 de Julio de 2006, 22:22
Me apunto, aunque me va a costar :comp:.

Una duda, ahora que mencionaron Allegro, lo que pensé para implementar el reto sería:Para quien no ha manejado Allegro, esta librería define un tipo de dato BITMAP (http://alleg.sourceforge.net/onlinedocs/en/alleg001.html#BITMAP) que contiene la información de una imagen, y screen es un BITMAP que apunta directamente a la memoria de video de la pantalla (lo que aparece en pantalla es lo que contiene el BITMAP screen).

Aclaro, no planeo usar Allegro para participar en el reto, y si a alguien interesado en manejar Allegro (porque le interese comenzar a manejar esta librería o por otra razón) le sirve, pues adelante. Mi duda es más bien en cuanto a los parámetros a cumplir del reto (lo de las funciones "de terceros" (casi cualquier otra opción por la que nos decantemos incluirá probablemente este tipo de cuestiones).

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Diodo en Domingo 9 de Julio de 2006, 00:10
Citar
Decidi hacerlo con C# en modo de ventana, no me he decidido si usar DirectX o GDI+ o alguna otra.
Apenas tengo hecha la interfaz grafica que creo que usare.

Yo tambien lo estoy haciendo en C#. Me falta unicamente la clase de dibujo y estoy en la misma duda que tu JuanK, la libreria GDI la domino mas, pero segun dicen es bastante lenta. Por cierto que no tienen ninguna funcion para dibujar pixels directamente.En otra aplicacion que hice para la universidad tuve que hacerlo dibujando elipses de radio 1 pixel

El domingo lo terminare  :D  , no pense que fuera a ir tan rapido ...  :whistling:

salu2  :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Domingo 9 de Julio de 2006, 03:12
Cita de: "geo"
    * Leer la información del archivo .bmp.
    * Convertirlo a un BITMAP de Allegro.
    * Una vez con esto, ¿qué sería válido para mostrar el BITMAP en pantalla?
          o Allegro cuenta con la función blit que me mandaría a pantalla (screen) este BITMAP.
          o ¿O habría que hacerlo "a mano", mandando los datos al BITMAP screen (copiando directamente en memoria) de Allegro?

Para quien no ha manejado Allegro, esta librería define un tipo de dato BITMAP que contiene la información de una imagen, y screen es un BITMAP que apunta directamente a la memoria de video de la pantalla (lo que aparece en pantalla es lo que contiene el BITMAP screen).

Aclaro, no planeo usar Allegro para participar en el reto, y si a alguien interesado en manejar Allegro (porque le interese comenzar a manejar esta librería o por otra razón) le sirve, pues adelante.

Depende como lo conviertas a bitmap de allegro, la idea es hacerlo dibujando en el bitmap de allegro, es decir tomas la informacion del archivo bmp y luego convietes los datos leidos en un color y usas la funcion putpixel de allegro para dibujar ese color.

Una vez tengas el bitmap de allegro dibujado, ya puedes copiarlo en pantalla con el metodo que quieras.

Cita de: "geo"
Mi duda es más bien en cuanto a los parámetros a cumplir del reto (lo de las funciones "de terceros" (casi cualquier otra opción por la que nos decantemos incluirá probablemente este tipo de cuestiones).

Si.
Título: Re: Formato Bmp
Publicado por: JuanK en Domingo 9 de Julio de 2006, 03:46
Cita de: "Diodo"
Citar
Decidi hacerlo con C# en modo de ventana, no me he decidido si usar DirectX o GDI+ o alguna otra.
Apenas tengo hecha la interfaz grafica que creo que usare.

Yo tambien lo estoy haciendo en C#. Me falta unicamente la clase de dibujo y estoy en la misma duda que tu JuanK, la libreria GDI la domino mas, pero segun dicen es bastante lenta. Por cierto que no tienen ninguna funcion para dibujar pixels directamente.En otra aplicacion que hice para la universidad tuve que hacerlo dibujando elipses de radio 1 pixel

El domingo lo terminare  :D  , no pense que fuera a ir tan rapido ...  :whistling:

salu2  :hola:
Diodo, tecnicamente se puede decir que usar elipses es trampa, porque si puedes usar tecnicas para dibujar directamente.

http://msdn.microsoft.com/library/default....arp11152001.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp11152001.asp)


Este en especial:

http://msdn2.microsoft.com/en-us/library/5ey6h79d.aspx (http://msdn2.microsoft.com/en-us/library/5ey6h79d.aspx)
Título: Re: Formato Bmp
Publicado por: su - en Domingo 9 de Julio de 2006, 03:51
Y si uso librerias como Gtk, Tk o wxWidgets dibujando pixel por pixel?
Título: Re: Formato Bmp
Publicado por: Geo en Domingo 9 de Julio de 2006, 05:20
Yo creo que es válido, pero JuanK dirá :P.

Por cierto JuanK, no se ve la imagen que colocaste.

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Diodo en Domingo 9 de Julio de 2006, 09:31
Citar
Diodo, tecnicamente se puede decir que usar elipses es trampa, porque si puedes usar tecnicas para dibujar directamente.

http://msdn.microsoft.com/library/default....arp11152001.asp (http://msdn.microsoft.com/library/default....arp11152001.asp)

Este en especial:

http://msdn2.microsoft.com/en-us/library/5ey6h79d.aspx (http://msdn2.microsoft.com/en-us/library/5ey6h79d.aspx)

Si es trampilla para este caso (ademas de una chapuza), pero no he dicho que lo fuera a usar.
Lo de  la variable Bitmap lo habia pensado pero no sabia si no era del todo hacer trampa, ya que luego habria que usar una funcion para cargarlo en pantalla no??

De igual forma gracias por los links , si los hubiera conseguido hace 2 meses me habria quedado mejor la aplicacion que hice

salu2  :hola:
Título: Re: Formato Bmp
Publicado por: Diodo en Domingo 9 de Julio de 2006, 09:53
Sorry. Ahora repasando las normas... no me habia dado cuenta de estos 2 puntos:

Citar
*Para dibujar la imagen no se admiten funciones de terceros que hagan mas alla de poner un pixel en pantalla o en un buffer secundario.

*Los bloques relacionados con el dibujo de pixels en pantalla o en buffer deben ser propios, salvo en el caso que se dibuje en un buffer secundario y luego se desee copiar este buffer secundario en pantalla, para lo cual es validon utilizar funciones de 'blit' incluidas en las librerias usadas

Considerando el Bitmap como buffer...... se supone que esta permitido.

 :lol:   :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Domingo 9 de Julio de 2006, 11:57
Cita de: "su -"
Y si uso librerias como Gtk, Tk o wxWidgets dibujando pixel por pixel?
DEpende de como las uses, revisa las reglas.
Título: Re: Formato Bmp
Publicado por: Diodo en Domingo 9 de Julio de 2006, 14:16
Bueno ya lo termine. Me tarda unos 5 segundos en mostrar un BMP de 500x360, supongo que se puede mejorar y bastante, asi que seguire investigando hasta que dure el reto.
La interfaz es algo cutre (un miniform con un boton y por cada bmp se abre otro form con el tamaño de la imagen), voy a ver si la mejoro poniendo unas tabpages sobre un formulario, y que se abra una tabpage por cada bmp cargado

salu2  :hola:
Título: Re: Formato Bmp
Publicado por: Enko en Domingo 9 de Julio de 2006, 18:10
Como estaba aburrido decidi hacer el reto SIN PARTICIPAR de la competencia.

Ya está terminado, pero no se porque causa, a veces, algunos bitmap que los modifico con el paint (en muy raras ocaciones) se abren torcidos  :blink:

Igualmente, hice una clase que se encarga de Abrir, Guardar, mostrar, es decirm, todo está en el mismo modulo. (como no voy a competir, no importa)

Segun veo, lo que más tarda es mostrar la imagen en la pantalla, por ahora lo estoy haciendo Piexel por Pixel, igualemente, ahora trataré de buscar una forma más rápida.

Citar
TSimpleBitmap = class
  private
    FBitmap: PPixel24bit; //definido más arriba pero no posteo
    FBitmapHeader: TBitmapHeader;//definida más arriba pero no la posteo
    FWidth: LongWord;
    FHeight: LongWord;
    procedure SetSize(AWidth, AHeight: LongWord);
    function GetPixel(X, Y: LongWord): TPixel24bit;
    procedure SetHeight(const Value: LongWord);
    procedure SetPixel(X, Y: LongWord; const Value: TPixel24bit);
    procedure SetWidth(const Value: LongWord);
    procedure ReSize;
  public
    constructor Create; overload;
    constructor Create(AWidth, AHeight: LongWord); overload;
    destructor Destroy; override;
    property Width: LongWord read FWidth write SetWidth;
    property Height: LongWord read FHeight write SetHeight;
     
    //las propiedades que importan
    property Pixels[X,Y: LongWord]:TPixel24bit read GetPixel write SetPixel;
    procedure LoadFromFile(const FileName: String);
    procedure SaveToFile(const FileName: String);
    procedure Draw(DestBitmap: TCanvas);
  end;
Título: Re: Formato Bmp
Publicado por: Geo en Domingo 9 de Julio de 2006, 23:16
Pero si lo interesante es participar :D. Ya, al final (muchas veces pasa), no hay ganador ni nada, pero todos aprendemos compartiendo.

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Eternal Idol en Domingo 9 de Julio de 2006, 23:31
Cita de: "Enko"
Ya está terminado, pero no se porque causa, a veces, algunos bitmap que los modifico con el paint (en muy raras ocaciones) se abren torcidos  :blink:
Busca info sobre padding.
Título: Re: Formato Bmp
Publicado por: JuanK en Domingo 9 de Julio de 2006, 23:44
Cita de: "Enko"
Ya está terminado, pero no se porque causa, a veces, algunos bitmap que los modifico con el paint (en muy raras ocaciones) se abren torcidos  :blink:
 :D
si ese error es clasico, te hace falta una pequeña validacion en el codigo.

Por eso les recomiendo a todos que prueben con varios bmp diferentes para que cubran la totalidad de los casos.
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 03:10
He agregado documentacion en los criterios a evaluar.  :ph34r:
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 08:29
Cita de: "Enko"
Ya está terminado, pero no se porque causa, a veces, algunos bitmap que los modifico con el paint (en muy raras ocaciones) se abren torcidos  :blink:
 
Es extraño pero al parecer al dibujar copiando los datos del bmp en 3l objeto Bitmap de C# parecer no ser necesaria esta validacion. Puedes  pasarnos una de las imagenes con las que te fallaba?
He tratado de crear casos y ninguno me dio incluso los que habia usado en una aplicacion que hice en C( donde si aplicaba el caso) no me fallaron al dibujar en el objeto bitmap de C#.
Título: Re: Formato Bmp
Publicado por: Eternal Idol en Lunes 10 de Julio de 2006, 09:26
Cita de: "JuanK"
Es extraño pero al parecer al dibujar copiando los datos del bmp en 3l objeto Bitmap de C# parecer no ser necesaria esta validacion. Puedes  pasarnos una de las imagenes con las que te fallaba?
He tratado de crear casos y ninguno me dio incluso los que habia usado en una aplicacion que hice en C( donde si aplicaba el caso) no me fallaron al dibujar en el objeto bitmap de C#.
Me parece que el lo esta haciendo en Delphi y no en C#.
Título: Re: Formato Bmp
Publicado por: Diodo en Lunes 10 de Julio de 2006, 09:32
Finished  :smartass:

Siguiendo los enlaces de JuanK he conseguido mejorar el programa, tanto como que ahora los BMPs se cargan instantaneamente (ms) en pantalla, da igual el tamaño.

Citar
He agregado documentacion en los criterios a evaluar

A que te refieres con documentacion?? comentar el codigo??  :ph34r:

Por cierto cuantos somos para el reto?? Parece que no va muy en serio la competencia. Bueno como decian lo imporatante es participar.Si les parece una vez acabados se podria crear un post con los codigos de diferentes lenguajes en los que hicimos el programa,.... , supongo que a alguien le seria de utilidad

salu2  :hola:

PD : cuando quieras te lo mando JuanK
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 13:23
Cita de: "Diodo"
Finished  :smartass:

Siguiendo los enlaces de JuanK he conseguido mejorar el programa, tanto como que ahora los BMPs se cargan instantaneamente (ms) en pantalla, da igual el tamaño.

Citar
He agregado documentacion en los criterios a evaluar

A que te refieres con documentacion?? comentar el codigo??  :ph34r:

Por cierto cuantos somos para el reto?? Parece que no va muy en serio la competencia. Bueno como decian lo imporatante es participar.Si les parece una vez acabados se podria crear un post con los codigos de diferentes lenguajes en los que hicimos el programa,.... , supongo que a alguien le seria de utilidad

salu2  :hola:

PD : cuando quieras te lo mando JuanK
Ya decia yo que se te demoraba mucho, imagino que lo hiciste usando la copia de los apuntadores ( Marshall).

A mi tambien me quedo instantaneo,  no ses ite fijas pero cuando escalas el dibujo el .net le hace una difusion de imagenes para m,ejorar la calidad, es un buen ejercicio quitarsela.

Yo tambien ya lo hice en C# pero tambien lo tengo en C y allegro.

Lo de la documentacion si me refiero a usar de maner 'suficiente' el codigo.


Y si, cuando quieras lo puedes enviar.
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 13:24
Cita de: "Eternal Idol"
Cita de: "JuanK"
Es extraño pero al parecer al dibujar copiando los datos del bmp en 3l objeto Bitmap de C# parecer no ser necesaria esta validacion. Puedes  pasarnos una de las imagenes con las que te fallaba?
He tratado de crear casos y ninguno me dio incluso los que habia usado en una aplicacion que hice en C( donde si aplicaba el caso) no me fallaron al dibujar en el objeto bitmap de C#.
Me parece que el lo esta haciendo en Delphi y no en C#.
Asi es pero el comentario es para que no se despisten los que lo estan haciendo en C#.
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 13:46
Cita de: "Geo"
Pero si lo interesante es participar :D. Ya, al final (muchas veces pasa), no hay ganador ni nada, pero todos aprendemos compartiendo.

Saludos,
JJ (Geo).
Si creo que eso es lo importante, = no hay ningun tipo de premio. Ojala todos los que lo hagan lo entreguen parab que compartamos el codigo.
Título: Re: Formato Bmp
Publicado por: Diodo en Lunes 10 de Julio de 2006, 18:34
Hola de nuevo

Haciendo pruebas con algunos BMPs hubo uno en que me "fallo", como si ese BMP tuviera otro orden en los bytes de color.
Yo los leo del archivo segun este orden: offset,b1,g1,r1,b2,g2,r2,b3,g3,r3,.......
y los voy poniendo en el bitmap de abajo a arriba y de izquierda a derecha.
Bueno esto ultimo no se muy bien como iba en el vector del bitmapdata, pero haciendo pruebas simplemente los puse en ese orden en el vector y van bien colocados.
Lo curioso del bmp que me dio problemas es que lo abri con el paint lo volvi a guardar y entonces si estaban bien los colores  ;)

De momento no lo entrego  :lol:  seguire investigando poco a poco

Citar
Ya decia yo que se te demoraba mucho, imagino que lo hiciste usando la copia de los apuntadores ( Marshall).

Si estoy usando el codigo de la pagina que pusiste, simplemente cambie el formato de pixel del bitmap y funciona perfectamente

Citar
A mi tambien me quedo instantaneo, no ses ite fijas pero cuando escalas el dibujo el .net le hace una difusion de imagenes para m,ejorar la calidad, es un buen ejercicio quitarsela.

No he podido fijarme, ya que lo meto a tamaño real, si se pasa de la ventana simplemente le pongo un scrollbar  :lol:
Título: Re: Formato Bmp
Publicado por: Geo en Lunes 10 de Julio de 2006, 19:03
Cita de: "Diodo"
Por cierto cuantos somos para el reto?? Parece que no va muy en serio la competencia. Bueno como decian lo imporatante es participar.Si les parece una vez acabados se podria crear un post con los codigos de diferentes lenguajes en los que hicimos el programa,.... , supongo que a alguien le seria de utilidad
Ya tengo algo con Allegro, el programa se llama desde consola pasando el nombre de la imagen desde la línea de comandos, se carga y se "dibuja" a un BITMAP de Allegro, luego se muestra escalado en una ventana 800x600.

Pero quiero hacerlo con alguna librería GUI multiplataforma (no he manejado ninguna, siempre he trabajado en consola :P), es solo que no he encontrado tiempo para ponerme de lleno (vamos, Allegro ya la conozco un poco :D), al menos lo que hice con Allegro garantiza mi participación, espero tengan un poco de paciencia :D.

Por cierto, ¿cómo vas Danielo?

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Diodo en Lunes 10 de Julio de 2006, 19:10
Tranquilo  :lol:  Yo tampoco tengo prisa, es mas aun no funciona en todos,todos,todos los casos  :whistling: . Mas que nada lo decia por que creo que somos 3 o 4. Aun hay tiempo para que se anime alquien mas, en realidad si esta divertido el reto, ademas me viene bien para aprender cosas nuevas de c# y como es la estructura de un BMP

salu2  :hola:  y suerte
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 19:13
ejejeje y eso que omiti lo del color de 16 bit... eso lo habria puesto muy interesante al menos para hacerlo en C.
Título: Re: Formato Bmp
Publicado por: senzao18 en Lunes 10 de Julio de 2006, 19:52
mmm no tendien muy bien....


Se tiene que pedir un archivo bmp y que luego me lo muestre???

O tengo que redibujarlo???


Me hice bolas....
Título: Re: Formato Bmp
Publicado por: Geo en Lunes 10 de Julio de 2006, 20:16
El usuario indica qué archivo se va a mostrar, y supongo que lo puedes implementar como desees, pasándolo como parámetro desde la línea de comandos, o con algún diálogo de apertura de archivo.

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 20:32
Cita de: "senzao18"
mmm no tendien muy bien....


Se tiene que pedir un archivo bmp y que luego me lo muestre???

O tengo que redibujarlo???


Me hice bolas....
Resumen:
Pedir la ruta de un archivo BMP y luego dibujarlo sin utilizar lqs funciones de carga de BMP que ya vienen con el lenguaje y/o librerias que uses. El dibujo de los datos del bmp leidos del archivo se deben hacer solo haciendo uso de la funcion putpixel ( o similares) o con algun mecanismo propio para tal fin.

Desde luego hay que señirce a las condiciones del reto.
Título: Re: Formato Bmp
Publicado por: senzao18 en Lunes 10 de Julio de 2006, 20:44
Ah
 jajaja se me hacia demasiado facil solo seleccionar y mostrar...
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 20:46
Cita de: "senzao18"
Ah
 jajaja se me hacia demasiado facil solo seleccionar y mostrar...
Pero de todas maneras el reto esta muy facil, prueba y veraz.
Título: Re: Formato Bmp
Publicado por: senzao18 en Lunes 10 de Julio de 2006, 21:04
Lo que tengo hecho ahorita es meterlo en un objeto BMP

barrer pixel a pixel y redibujarlo en otro bmp,

eso vale?
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 21:06
no  :comp:  :devil:
Título: Re: Formato Bmp
Publicado por: Enko en Lunes 10 de Julio de 2006, 21:14
Cita de: "Eternal Idol"
Cita de: "JuanK"
Es extraño pero al parecer al dibujar copiando los datos del bmp en 3l objeto Bitmap de C# parecer no ser necesaria esta validacion. Puedes  pasarnos una de las imagenes con las que te fallaba?
He tratado de crear casos y ninguno me dio incluso los que habia usado en una aplicacion que hice en C( donde si aplicaba el caso) no me fallaron al dibujar en el objeto bitmap de C#.
Me parece que el lo esta haciendo en Delphi y no en C#.
Sip, pero no se como sucede. Todavía no logro reproducir la amanera uqe sucede el error:

Abro la imagen en mi programa, todo bien.
Abro la Imagen con el paint, la modifico y despues, a veces, se abre como torcido diagonalmente con los colores semi mezclados, parecido a lo que ocurre cuando se leen los pixeles de un bmp con el ancho-1. El tema es que si cambio el ancho de lectura en esos casos, se empeora. Los demás programas abren bien la imagen.

Probé hacer lectura de pixels saltando directamente al offset 54, pero es lo mismo.

Lo que me extraña es que casi nunca sucede.  :blink:
Yo supongo que debe ser una validación mas que falta como dice Juank.
Título: Re: Formato Bmp
Publicado por: Enko en Lunes 10 de Julio de 2006, 21:15
Cita de: "JuanK"
no  :comp:  :devil:
Ademas supongo uqe tampoco vale usar MATRICES DINAMICAS  PREDEFINIDAS como en Visual Basic por ejemplo, ¿o no?
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 21:29
Cita de: "Enko"
Cita de: "JuanK"
no  :comp:  :devil:
Ademas supongo uqe tampoco vale usar MATRICES DINAMICAS  PREDEFINIDAS como en Visual Basic por ejemplo, ¿o no?
En teoria si, pero depende que cosas sean las que les hace el array que usen.

----
Si necesitas mas ayuda con lo de la validacion y te cansaste de buscar... pidela, a mi me costo mucho cuando hice el programa de los filtros gfraficos en C y allegro y no encontre informacion al respecto en internet... tarde un buen tiempo en sacarlo por ingenieria inversa.
Título: Re: Formato Bmp
Publicado por: Enko en Lunes 10 de Julio de 2006, 22:51
Citar
no encontre informacion al respecto en internet...
Realmente es una pena. TanTa info basura... LA BUEN INFORMACION ESTÁ MONOPOLIZADA por compañias que tienen el dominio :(

¿Cuantas veces nos pasa que buscamos algo en internet y simplemente NO EXISTE? :angry:

Gracias por la ayuda, igualmente ahora tengo unas terribles ganas de jugar con un heditor exadecimal.

A PARTE:
se me ocurió una cosa para mandar mensajes ocultos en un bmp.
En la cabecera se guarda el ancho y el alto, por lo que el programa que lee el bmp, va leer solo  hasta llenar el ancho y el alto completo de la matriz.
Con eso, todos los bytes que esten despues del mapa, no serán leídos y si le añadimos algun cifrado barrato con un XOR  :kicking:  
Ahora lo pruebo y despues cuento...
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 10 de Julio de 2006, 23:03
jajajaj  :lol: en  efecto para mi proyecto de grado me aproveche de esa situacion y cree mi propio formato derivado de la estructura de los bmp y asi fue como complete toda la demas informacion que me faltaba para los graficos y las animaciones de mi juego.
Título: Re: Formato Bmp
Publicado por: Enko en Martes 11 de Julio de 2006, 01:07
Cita de: "JuanK"
jajajaj  :lol: en  efecto para mi proyecto de grado me aproveche de esa situacion y cree mi propio formato derivado de la estructura de los bmp y asi fue como complete toda la demas informacion que me faltaba para los graficos y las animaciones de mi juego.
Todavía no tuve que hacer eso. Lo que por lo general hago, es una imagen BMP con los distintos Tiles de la animacion . Aunque ahora que lo pienso, está bueno configurar la animacion directamente desde la imagen y no el código.
En muchos juegos, se ve que usan archivos a parte para configurar las animaciones (Ej: Artes Arcanas).

Admito que la idea está buena, se evita tener muchos archivos y ademas, los sprites se pueden ver desde cualquier visor. Lo malo es que si los modificas con Paint por ej. esa info extra se borra. :(
Título: Re: Formato Bmp
Publicado por: JuanK en Martes 11 de Julio de 2006, 01:16
Si, pero es que el archivo solo s epodia abrir desde mi propio editor.

en un solo tile tenia todas las imagenes y como no todos los cuadros eran iguales y habian cuadros compuestos entre dos y mas recuadros pequeños, entonces almacenaba la informacion relevante a las posiciones de cada 'subBMP' dentro del bmp grande asi como otras infromaciones adicionales.

Todo en el mismo archivo y solo se podian crear ( codificar) y leer ( decodificar) con unas librerias que yo mismo cree para tal fin.
Título: Re: Formato Bmp
Publicado por: Nagisa en Martes 11 de Julio de 2006, 17:23
Hola:

Yo ya casi lo tengo terminado. Solo me falta pulir un par de detalles y ya estara listo (creo).  :)

Una pregunta JuanK: la solucion la posteamos aqui directamente o te la enviamos por MP?  :blink:

Saludos  :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Martes 11 de Julio de 2006, 17:27
de preferencia a mi correo en archivo .zip o .rar pero cambiandole la extencion a .doc para que puedan subir los exes en el zip / rar

juank.ruiz@gmail.com

cuando ya todos hayan terminado las colocare publicas.
Título: Re: Formato Bmp
Publicado por: inforsystem en Miércoles 12 de Julio de 2006, 01:57
Cita de: "Enko"
Cita de: "Eternal Idol"
Cita de: "JuanK"
Es extraño pero al parecer al dibujar copiando los datos del bmp en 3l objeto Bitmap de C# parecer no ser necesaria esta validacion. Puedes  pasarnos una de las imagenes con las que te fallaba?
He tratado de crear casos y ninguno me dio incluso los que habia usado en una aplicacion que hice en C( donde si aplicaba el caso) no me fallaron al dibujar en el objeto bitmap de C#.
Me parece que el lo esta haciendo en Delphi y no en C#.
Sip, pero no se como sucede. Todavía no logro reproducir la amanera uqe sucede el error:

Abro la imagen en mi programa, todo bien.
Abro la Imagen con el paint, la modifico y despues, a veces, se abre como torcido diagonalmente con los colores semi mezclados, parecido a lo que ocurre cuando se leen los pixeles de un bmp con el ancho-1. El tema es que si cambio el ancho de lectura en esos casos, se empeora. Los demás programas abren bien la imagen.

Probé hacer lectura de pixels saltando directamente al offset 54, pero es lo mismo.

Lo que me extraña es que casi nunca sucede.  :blink:
Yo supongo que debe ser una validación mas que falta como dice Juank.
Código: Text
  1. ancho = ancho_imagen *3; */ alineado para la linea de exploraciòn */
  2.  
  3. Se multiplica x3 por que cada pixel se representa por 3 bytes (r,g,b,).
  4. Luego:
  5.  
  6. ancho = (ancho + 3) & ~3; */ alineado en 4 bytes*/
  7.  
  8. bitsize = ancho * alto_imagen;
  9.  

saludos.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 14:57
Tu code Lo he quitado por que creo que enko no los pidio porque quiere hacerlos el mismo, por cierto no entiendo muy buie lo que hiciste, yo lo hacia de nua manera mas sencilla
Título: Re: Formato Bmp
Publicado por: Nagisa en Miércoles 12 de Julio de 2006, 15:47
Uhm... La verdad que es casualidad, pero yo lo hacia igual...
Título: Re: Formato Bmp
Publicado por: Enko en Miércoles 12 de Julio de 2006, 17:06
Juank, recuerdo que habías pedido una copia de una imagen que causara el problema, te adjunto una de ellas.

(creo que se producen cuando creas el BMP original con ButonDerecho>>Nuevo>>Imagen de mapa de Bits, en el explorador y luego la modificas con paint)
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 17:12
Gracias enko.

Si convierten esta a bmp tambien les puede fallar.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 18:27
He recibido la solucion de Nagisa y Diodo. :comp:

Los demas animense!!!  :lol:
Título: Re: Formato Bmp
Publicado por: Enko en Miércoles 12 de Julio de 2006, 18:55
Ya encontré la solucion.


Como el intercambio de info en el thread está permitido,
Posteo en Ingles, ya que no soy buen traductor. Eso es lo único que hace falta ademas de saber como es la cabecera.

Citar
Few things to remember
1) Unfortunately, BMP data is not written from left to right -> left to right etc (like we read a book), insted it is written from right to left -> right to left etc from Bottom to Top. That means writing of pixel data starts from Bottom Right and ends in Top Left. In our example the problem will not reflect, since all the 100 (10 x 10) pixels are same pale magenta!

2) The number of bytes of the Picture Data in one each row should be a multiple of 4. We have to padd extra zeroes to kame it a multiple of 4. In our case, the picture's width is 10 pixels. So find the remainder of the division 10 / 4. The remainder is 2. So TWO zero bytes should be padded with each row's data.

Con el heditor exadecimal me había dado cuenta que se agregaban 00 demás, pero pensé que solo era al final del archivo y no entendía el sentido.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 19:11
oK , LA INFROMACION ESTA DEVUELTA.

Mi solucion, si mal no estoy es:

Código: Text
  1. ancho= (BMPwith * bytesPerPixel);
  2. ...
  3.  
  4. ancho+= ancho%4;
  5. bitsize = ancho * alto_imagen;
  6.  
Título: Re: Formato Bmp
Publicado por: Geo en Miércoles 12 de Julio de 2006, 19:25
Yo tenía esto:
Código: Text
  1.  
  2.   ancho = mb->cabInfo.ancho;
  3.  
  4.   alto = abs(mb->cabInfo.alto);
  5.  
  6.   bpp = mb->cabInfo.bitsPorPixel;
  7.  
  8.  
  9.  
  10.   bytesLinea = bytesLineaRelleno =(LONG) ( (float)ancho * (float)bpp / 8 );
  11.  
  12.   while (bytesLineaRelleno % 4 != 0)
  13.  
  14.     bytesLineaRelleno++;
  15.  
  16.    
  17.  
  18.   // Bytes de imagen sin relleno.
  19.  
  20.   bytesImagen = alto * bytesLinea;
  21.  
  22.  
  23.  

Ok, me apuro, voy a reescribir la función de carga de info del mapa de bits, voy a intentar con wxWidgets y lo que tenía me da muchos errores por los tipos de datos :P.

Ahorita mismo hice unas pruebas para convertir un wxString a char* y me está dando muchos dolores de cabeza, por eso voy a reescribir las funciones para que reciban como parámetros tipos de wxWidgets.

saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Diodo en Miércoles 12 de Julio de 2006, 19:37
Ups, es verdad salen torcidas  :lol: , pues eso en mi programa o funciona  :whistling:
Título: Re: Formato Bmp
Publicado por: Nagisa en Miércoles 12 de Julio de 2006, 19:45
Cita de: "JuanK"
oK , LA INFROMACION ESTA DEVUELTA.

Mi solucion, si mal no estoy es:

Código: Text
  1. ancho= (BMPwith * bytesPerPixel);
  2. ...
  3.  
  4. ancho+= ancho%4;
  5. bitsize = ancho * alto_imagen;
  6.  

Hola!!

La verdad es que creo que esta mal. La solucion seria:

Código: Text
  1.  
  2. if (ancho%4 != 0 ) ancho += (4 - ancho%4);
  3.  
  4.  

Por lo que no vale tu forma es por que si tengo una imagen de 5x5, ancho es 15, y ancho = 15 + 15%4 = 15 + 3 = 18, que sigue sin ser multiplo de 4.

La otra forma que postearon antes tambien era valida (es la que yo use en mi solucion). Lo que te hace es ahorrarte la comprobacion y calcular el modulo, es decir dos divisiones... La verdad que no es gran cosa por que esta operacion solo deberia de hacerse una vez en todo el codigo, pero menos es nada ;)

Un saludo!!
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 20:26
Cita de: "Nagisa"
Hola!!

La verdad es que creo que esta mal. La solucion seria:

Código: Text
  1.  
  2. if (ancho%4 != 0 ) ancho += (4 - ancho%4);
  3.  
  4.  

Por lo que no vale tu forma es por que si tengo una imagen de 5x5, ancho es 15, y ancho = 15 + 15%4 = 15 + 3 = 18, que sigue sin ser multiplo de 4.

La otra forma que postearon antes tambien era valida (es la que yo use en mi solucion). Lo que te hace es ahorrarte la comprobacion y calcular el modulo, es decir dos divisiones... La verdad que no es gran cosa por que esta operacion solo deberia de hacerse una vez en todo el codigo, pero menos es nada ;)

Un saludo!!
Hola!, Bueno como te dije no recuerdo muy bien como era mi solucion, tendria que revisar en la noche mi viejo codigo C, pero lo que si recuerdo muy bien es que e solo usa un modulo, seguro en C es algo asi como esto:

Código: Text
  1.  
  2.   ancho += (4 - ancho%4 )&#59;
  3.  
  4.  

En todo caso reviso y les cuento.

Y claro esto no afecta el performance porque esta operacion se hace solo una vez.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 20:27
Cita de: "geo"
Código: Text
  1. while (bytesLineaRelleno % 4 != 0)
  2.    bytesLineaRelleno++;
  3.  

Ahora que veo estas lineas de geo, se me hacen muy familiares, no descartaria que asi fuera como yo lo tenia.
Título: Re: Formato Bmp
Publicado por: Enko en Miércoles 12 de Julio de 2006, 20:29
Citar
padWidth := FWidth mod 4;
    for j:=FHeight downto 1 do
    begin
      for i:=1 to FWidth do
      begin
        BlockRead(F, Pixel, sizeOf(Pixel), Transfer);
        if Transfer=0 then Break;
        Pixels[i,j] := Pixel;
      end;
      Seek(F, FilePos(F)+padWidth);
    end;
Basicamente los que hace es:
Leer completamente la Fila y luego se saltea en el archivo los Bytes agregados (pueden ser 1,2 o 3).
FilePos, es la posicion actual en el fichero, padWidth, son los bytes necesarios para que sea multiplo de 4 el ancho.

PD:
Leer pixel por pixel es lento. Se puede usar de seguro un MemCopy para leer toda la fila (por eso es multiplo de 4).
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 12 de Julio de 2006, 20:39
Cita de: "Enko"
Citar
padWidth := FWidth mod 4;
    for j:=FHeight downto 1 do
    begin
      for i:=1 to FWidth do
      begin
        BlockRead(F, Pixel, sizeOf(Pixel), Transfer);
        if Transfer=0 then Break;
        Pixels[i,j] := Pixel;
      end;
      Seek(F, FilePos(F)+padWidth);
    end;
Basicamente los que hace es:
Leer completamente la Fila y luego se saltea en el archivo los Bytes agregados (pueden ser 1,2 o 3).
FilePos, es la posicion actual en el fichero, padWidth, son los bytes necesarios para que sea multiplo de 4 el ancho.

PD:
Leer pixel por pixel es lento. Se puede usar de seguro un MemCopy para leer toda la fila (por eso es multiplo de 4).
Asi es enko.

En efecto alguna vez lei que se dejode 24 bit porque es mucho mas rapido manejar los movimientos con un entero de 32 que con un short de 16 y un byte de 8.

La transferencia del bloque completo es la mejor y mas rapida, y fue la que use en mi caso aunque no hice paso por fila sino paso directo de todo ( en la parte del dibujo).
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 02:58
Saludos, he revisado y lo tengo como lo hacia Geo.

Algiuen me puede explicaar que hace esto?

Código: Text
  1.  
  2. ancho = (ancho + 3) & ~3; */ alineado en 4 bytes*/
  3. bitsize = ancho * alto_imagen
  4.  

Es decir ya se que hace pero no se la lógica usada para lograrlo.


gracias.
Título: Re: Formato Bmp
Publicado por: Danielo en Jueves 13 de Julio de 2006, 04:04
Estoy en el módulo Dibujo y tengo algunas dudas con la información del cabezal del archivo bmp:
Código: Text
  1. typedef struct {
  2.    unsigned int size;               /* Header size in bytes      */
  3.    int width,height;                /* Width and height of image */
  4.    unsigned short int planes;       /* Number of colour planes   */
  5.    unsigned short int bits;         /* Bits per pixel            */
  6.    unsigned int compression;        /* Compression type          */
  7.    unsigned int imagesize;          /* Image size in bytes       */
  8.    int xresolution,yresolution;     /* Pixels per meter          */
  9.    unsigned int ncolours;           /* Number of colours         */
  10.    unsigned int importantcolours;   /* Important colours         */
  11. } INFOHEADER;
  12.  
No entiendo la diferencia entre ncolours e importantcolours. Hice un programita de prueba que despliega en pantalla todos los datos del bmp y me sale todo coherente (al menos para mi) hasta:

xresolution=0;
yresolution=0;
ncolours=0;
importantcolours=0;

 :blink: ¿eso está bien?... yo pensaba que ncolours almacenaba la cantidad de colores que tiene  el bmp, pero como me sale 0 parecería que es otra cosa.

... ¿y que son los importantcolours?... ¿colores importantes?... ¿está bien que sea 0?

Análoga duda con xresolution e yresolution  :(
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 04:29
ni te fijes:

xresolution=0;
yresolution=0;
ncolours=0;
importantcolours=0;


no se usan en bmp de 24 bits, o al menos no para un bmp24 standart.
Título: Re: Formato Bmp
Publicado por: Geo en Jueves 13 de Julio de 2006, 05:22
Cita de: "Danielo"
No entiendo la diferencia entre ncolours e importantcolours. Hice un programita de prueba que despliega en pantalla todos los datos del bmp y me sale todo coherente (al menos para mi) hasta:

xresolution=0;
yresolution=0;
ncolours=0;
importantcolours=0;

 :blink: ¿eso está bien?... yo pensaba que ncolours almacenaba la cantidad de colores que tiene  el bmp, pero como me sale 0 parecería que es otra cosa.

... ¿y que son los importantcolours?... ¿colores importantes?... ¿está bien que sea 0?

Análoga duda con xresolution e yresolution  :(
El primero da el número de colores presentes en el mapa de bits cuando este es de menos de 24 bits, y, para el tipo de mapa de bits que estamos manejando efectivamente es 0.

El otro indica el número de colores (o el númeor de índices de colores) que son importantes para mostrar el mapa de bits, cuando todos son importantes este campo vale 0.

JuanK, también me gustaría que me comentaran al respecto sobre ese código :D.
Código: Text
  1.  
  2. ancho = (ancho + 3) & ~3; */ alineado en 4 bytes*/
  3. bitsize = ancho * alto_imagen
  4.  
  5.  

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Enko en Jueves 13 de Julio de 2006, 14:19
Citar
ancho = (ancho + 3) & ~3;
Citar
ancho := (ancho + 3) and not 3;

Esto devuelve un numero multiplo de 4 menor a X. Es decir:
Multiplo de 4 < X
Código: Text
  1.  
  2. result := X and not 3;
  3.  
  4.  
Por eso es ancho + 3, para que al devolver el menor, sea en realidad el acho + los bytes  extra.

es como sacar el resto pero m'as rapido.
aunque todavia no logro entender los de AND NOT, tendria que ser como + -, es decir, al final el numero de entrada ser'ia el mismo que el de la salida. :rolleyes:
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 14:37
Cita de: "Enko"
Citar
ancho = (ancho + 3) & ~3;
Citar
ancho := (ancho + 3) and not 3;

Esto devuelve un numero multiplo de 4 menor a X. Es decir:
Multiplo de 4 < X
Código: Text
  1.  
  2. result := X and not 3;
  3.  
  4.  
Por eso es ancho + 3, para que al devolver el menor, sea en realidad el acho + los bytes  extra.

es como sacar el resto pero m'as rapido.
aunque todavia no logro entender los de AND NOT, tendria que ser como + -, es decir, al final el numero de entrada ser'ia el mismo que el de la salida. :rolleyes:
Hasta ahi creo que hemos entendido todos... pero aun queda la gran duda de:

como demonios  :devil:  se deduce eso  :scream:  :question:
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 14:43
Cita de: "Danielo"
Estoy en el módulo Dibujo y tengo algunas dudas con la información del cabezal del archivo bmp:
Código: Text
  1. typedef struct {
  2.    unsigned int size;               /* Header size in bytes      */
  3.    int width,height;                /* Width and height of image */
  4.    unsigned short int planes;       /* Number of colour planes   */
  5.    unsigned short int bits;         /* Bits per pixel            */
  6.    unsigned int compression;        /* Compression type          */
  7.    unsigned int imagesize;          /* Image size in bytes       */
  8.    int xresolution,yresolution;     /* Pixels per meter          */
  9.    unsigned int ncolours;           /* Number of colours         */
  10.    unsigned int importantcolours;   /* Important colours         */
  11. } INFOHEADER;
  12.  
No entiendo la diferencia entre ncolours e importantcolours. Hice un programita de prueba que despliega en pantalla todos los datos del bmp y me sale todo coherente (al menos para mi) hasta:

xresolution=0;
yresolution=0;
ncolours=0;
importantcolours=0;

 :blink: ¿eso está bien?... yo pensaba que ncolours almacenaba la cantidad de colores que tiene  el bmp, pero como me sale 0 parecería que es otra cosa.

... ¿y que son los importantcolours?... ¿colores importantes?... ¿está bien que sea 0?

Análoga duda con xresolution e yresolution  :(
Bueno debi extenderme un poco mas:

Código: Text
  1. int xresolution,yresolution;     /* Pixels per meter          */
  2.  
Esta informacion se usa en algunos casos para los aplicativos profesionaloes de diseño grafico ya que en pantalla el mapa de biste puede tener unas caracteristicas pero al momento de la impresion su tamaño debe ser diferente, asi que etsas dos se usan para determinar cuantos pixeles deben haber por cada metro al momento de imprimir. AQctualmente deben estar casi en desuso porque los aplicativos de diseño generalmente requieren cosas aun mas complejas y para ello usan suis propios formatos.

Citar
unsigned int ncolours;           /* Number of colours         */
Aunque al parecer es pura infromacion, creo que este campo se usa en los casos que no es color de 24 bit ni 16 bit, mejor dicho se usa en los casos que se usa la paleta, asi que el numero de colores que aparecen en este campo son el numero de colores representados por la paleta incluida en el bmp

Citar
unsigned int importantcolours;   /* Important colours       
No se, supongo que informacion nada mas.
Título: Re: Formato Bmp
Publicado por: Nagisa en Jueves 13 de Julio de 2006, 15:01
Hola!!

Citar
Código: Text
  1.  
  2. ancho = (ancho + 3) & ~3; */ alineado en 4 bytes*/
  3.  

La deduccion no es tan sencilla...

Para verlo, trabajando en base 10 es mas facil.

Digamos que quieres hacer que un numero sea multiplo de 100. Tienes tres opciones para redondearlo:

a ) Por defecto: Lo que se haria es forzar los dos ultimos digitos a cero.
b ) Al mas proximo: Sumas la mitad de la precision que quieres dar, y fuerzas los dos ultimos digitos a cero. En este caso, se sumaria 50. Sabes que para los menores de 49 se te queda en la centena anterior (por que subes como mucho a 99), y el resto se te pasan a la siguiente centena. Esto se suele usar mucho en aritmetica de coma flotante...
c ) Por exceso: El usado aqui. Es similar al anterior, solo que en lugar de sumar 50 se sumarian 99. Asi haces que todos suban a la centena superior salvo en el caso de que ya sea multiplo de 100.

Pues lo mismo, pero en base 2 y buscando multiplos de 4. Sumas tres, y con el AND fuerzas que los dos ultimos bytes sean cero (not 3 == 0xFFFFFFFC).

Espero haberme explicado... Yo por lo menos fue asi como lo vi.

Saludos!!
Título: Re: Formato Bmp
Publicado por: Enko en Jueves 13 de Julio de 2006, 15:03
Citar
como demonios devil.gif se deduce eso scream.gif question.gif
Creo que ahí estamos hablando sobre un hiptético programador ideal, omniciente, omnipotente y perfecto que nos deja estos tips, y pasan de codigo a código.
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 15:30
Cita de: "Enko"
Citar
como demonios devil.gif se deduce eso scream.gif question.gif
Creo que ahí estamos hablando sobre un hiptético programador ideal, omniciente, omnipotente y perfecto que nos deja estos tips, y pasan de codigo a código.
jejeje tienes razon.

Citar
b ) Al mas proximo: Sumas la mitad de la precision que quieres dar, y fuerzas los dos ultimos digitos a cero. En este caso, se sumaria 50. Sabes que para los menores de 49 se te queda en la centena anterior (por que subes como mucho a 99), y el resto se te pasan a la siguiente centena. Esto se suele usar mucho en aritmetica de coma flotante...
c ) Por exceso: El usado aqui. Es similar al anterior, solo que en lugar de sumar 50 se sumarian 99. Asi haces que todos suban a la centena superior salvo en el caso de que ya sea multiplo de 100.

Con estos dos ya he visto un poco la luz yme parecen unos puntos clave.
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 15:35
enko, daniel y los demas  como van con su reto?

ya he revisado el de Nagisa y el de Diodo, estan muy buenos y ya tengo comentarios al respecto, si lo desean los podemos ir revisando de una vez, o esperamos a que los demas terminen, yo no he terminado el mio por falta de tiempo, tal vez lo haga el fin de semana aunque solo me falta la documentacion y 'limpiar' el codigo ya que por el camino quedaron algunas variables inoficiosas.
Título: Re: Formato Bmp
Publicado por: Nagisa en Jueves 13 de Julio de 2006, 16:29
Uhm... Creo que lo suyo es que se comente al final, cuando todos hayamos acabado el reto... Si no le quita un poco la gracia  :D

De todas formas JuanK, si hay algo que te guste comentar de mi programa en particular, ya sabes que es de sobra bienvenido. Yo veo esto como una forma de que otros que saben mas que yo vean mi codigo y me ayuden a mejorar.  :smartass:

Un saludo!  :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 16:35
Cita de: "Nagisa"
Uhm... Creo que lo suyo es que se comente al final, cuando todos hayamos acabado el reto... Si no le quita un poco la gracia  :D

De todas formas JuanK, si hay algo que te guste comentar de mi programa en particular, ya sabes que es de sobra bienvenido. Yo veo esto como una forma de que otros que saben mas que yo vean mi codigo y me ayuden a mejorar.  :smartass:

Un saludo!  :hola:
Si esa es la idea, creo que todos aprenderemos mucho con esto.
Título: Re: Formato Bmp
Publicado por: Geo en Jueves 13 de Julio de 2006, 19:35
Cita de: "JuanK"
enko, daniel y los demas  como van con su reto?
Sigo peléandome con wxWidgets  :kicking: (es la primera vez que voy a hacer algo con GUI :P), de este fin de semana no pasa  :comp:.

Si no, pues mando lo que tengo ya con Allegro  :smartass:.

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Enko en Jueves 13 de Julio de 2006, 21:06
A mi me falta hacer el leeme.txt y acomodar un poco la gui.
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 21:12
Cita de: "Enko"
A mi me falta hacer el leeme.txt y acomodar un poco la gui.
oops  :blink:

Tambien me falta el leame.  :o
Título: Re: Formato Bmp
Publicado por: Enko en Jueves 13 de Julio de 2006, 21:31
Cita de: "JuanK"
Cita de: "Enko"
A mi me falta hacer el leeme.txt y acomodar un poco la gui.
oops  :blink:

Tambien me falta el leame.  :o
APA  :rolleyes:
Título: Re: Formato Bmp
Publicado por: Diodo en Jueves 13 de Julio de 2006, 21:35
No hay prisa .... terminen tranquilamente  :comp:

Yo el fin de semana intentare solucionar el problema de que salgan torcidas las imagenes, con las indicaciones que han dado en los anteriores posts , tengo suficiente documentacion  :lol: ( en las paginas en las que me documente sobre la estructura de un bmp24 no decian nada). Pero vamos que el que vale para el reto es el que mande ...., ya mas tarde subire la version corregida

Con el tiempo a lo mejor me animo a meterle la posibilidad de cargar otros bmps (8, 16 bits), si no hace juank antes un reto sobre elló,(desocupado que es uno  ;) )
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 13 de Julio de 2006, 21:43
bueno, en todo caso es totalmente valido que envien el reto de nuevo con las correcciones que le hayan hecho, no importa.

Y si ya tengo planeado otro reto, he pensado lo de los bmp de 8 o 16 bits, pero quiero meterle un poco mas de emocion... despues les cuento. :devil:
Título: Re: Formato Bmp
Publicado por: Danielo en Jueves 13 de Julio de 2006, 23:33
Citar
enko, daniel y los demas como van con su reto?

Antes de nada, gracias a todos por la celeridad de la respuesta a mis dudas.

Al igual que Geo, tambien estoy con el GUI, y me esta costando un poco debido a que esta es la primera vez que tengo que hacer un programa con ventanas con C++ (cosa que me entusiasma), estoy intentando con las Win API que es algo nuevo para mi y tengo un montón de dudas, pero antes de hacer preguntas quisiera experimentar un poco más por mi mismo  :comp:
Título: Re: Formato Bmp
Publicado por: Enko en Viernes 14 de Julio de 2006, 01:21
Cita de: "Danielo"
Citar
enko, daniel y los demas como van con su reto?

Antes de nada, gracias a todos por la celeridad de la respuesta a mis dudas.

Al igual que Geo, tambien estoy con el GUI, y me esta costando un poco debido a que esta es la primera vez que tengo que hacer un programa con ventanas con C++ (cosa que me entusiasma), estoy intentando con las Win API que es algo nuevo para mi y tengo un montón de dudas, pero antes de hacer preguntas quisiera experimentar un poco más por mi mismo  :comp:
usar GDI es suicidio :scream:
No, es broma, tan dificil.
Título: Re: Formato Bmp
Publicado por: Danielo en Viernes 14 de Julio de 2006, 03:51
Citar
usar GDI es suicidio scream.gif
No, es broma, tan dificil.
Si, es un suicidio :( , de alguna manera ya lo había captado tal vez de forma subliminal mientras buscaba info en internet :scream:

Hasta ahora no encuentro nada parecido al (maravilloso) putpixel(x,y,color) de Borland para DOS, que exista en GDI, solo encuentro cosas como LoadImage y LoadBitmap que por lo visto cargan el bitmap automagicamente y no a partir de una matriz de bits...

...y ya estoy empezando a dudar que exista algo como putpixel  :( tampoco estoy seguro de estar cargando correctamente el mapa de bits ya que no tengo forma de mostrarlo en pantalla, asi que si alguien me da algún consejo le estaré muy agradecido  :rolleyes:
Título: Re: Formato Bmp
Publicado por: JuanK en Viernes 14 de Julio de 2006, 04:40
averigua en gdi acerca de lock bytes  :smartass:
Título: Re: Formato Bmp
Publicado por: Enko en Viernes 14 de Julio de 2006, 13:46
Cita de: "JuanK"
averigua en gdi acerca de lock bytes  :smartass:
http://winapi.conclase.net/ (http://winapi.conclase.net/)
Título: Re: Formato Bmp
Publicado por: Geo en Viernes 14 de Julio de 2006, 17:50
¡Ya casi! Ya tengo la ventana con wxWidgets y puedo abrir un bitmap mostrándolo en la misma, ahora a rechecar el código de apertura de la imagen pues me ha dado problemas con algunos mapas de bits, aunque la razón no la encuentro :blink:.

Para mostrar la imagen, cargo los datos del bitmap, luego los copio a una wxImage mediante su función miembro SetRGB( x, y, r, g, b ) (sería como un putpixel), y esta la paso a la ventana, la cual la convierte a un wxBitmap y la dibuja usando un wxPaintDC, espero que sea válido para lo del reto :P.

No la convierto directamente a wxBitmap pues el formato de esta clase (según la documentación) es dependiente de la plataforma (y el chiste de usar wxWidgets es que la aplicación sea multiplataforma :P), luego uso la función DrawBitmap de wxPaintDC que sería como hacer el blit :P.

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Enko en Viernes 14 de Julio de 2006, 17:58
Cita de: "Geo"
¡Ya casi! Ya tengo la ventana con wxWidgets y puedo abrir un bitmap mostrándolo en la misma, ahora a rechecar el código de apertura de la imagen pues me ha dado problemas con algunos mapas de bits, aunque la razón no la encuentro :P.

Para mostrar la imagen, cargo los datos del bitmap, luego los copio a una wxImage mediante su función miembro SetRGB( x, y, r, g, B) (sería como un putpixel), y esta la paso a la ventana, la cual la convierte a un wxBitmap y la dibuja usando un wxPaintDC, espero que sea válido para lo del reto :P.

No la convierto directamente a wxBitmap pues el formato de esta clase (según la documentación) es dependiente de la plataforma (y el chiste de usar wxWidgets es que la aplicación sea multiplataforma :P), luego uso la función DrawBitmap de wxPaintDC que sería como hacer el blit :P.

Saludos,
JJ (Geo).
Hago algo parecido Usando Un TBitmap. Es decir una vez cargada la imagen en una matriz dinamica, la dibujo sobre un TBitmap de Delphi y lo vuelco en la pantalla.
Título: Re: Formato Bmp
Publicado por: Geo en Viernes 14 de Julio de 2006, 19:47
Por ahora dejo sin "invertir" el bitmap para mostrarlo (o sea, está "de cabeza" :P), pero tengo problemas para cargar la imagen que subió Enko, no así con la que subió JuanK.

No he podido cargar correctamente la de Enko, los colores no se muestran correctamente y, en varias ocasiones, el programa falla y se cierra (lo raro es, no es siempre :blink:).

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: JuanK en Viernes 14 de Julio de 2006, 20:32
A mi la de enko me abre ok.

Geo, creo que se te esta reventando por memoria, revisa como pides memoria para el bitmap y ten en cuenta que no te debes confundir con eso del padding.
Título: Re: Formato Bmp
Publicado por: Geo en Sábado 15 de Julio de 2006, 17:44
Ya lo corregí, el problema era un par de errores "de dedo" en la parte del padding, pensé que todo allí estaba correcto pues algunas imágenes las cargaba sin problemas :P.

Funciona perfecto en Linux, pero tratando de compilar con VC++ Express nuevamente salen mal algunas imágenes, estoy seguro que es por la "alineación" y tamaño de algunos tipos de datos, ahorita voy a probar con MinGW (Dev-C++).

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Diodo en Sábado 15 de Julio de 2006, 21:30
Muy bueno tu programa Juank, he estado mirando tu codigo y he aprendido algunos truquillos como el de la transparencia del formulario que queda muy bien  :)  . Y el manejo de excepciones que haces, como habras visto yo no hago ningun try catch  ;)  , la falta de costumbre sera , la libreria dll,etc,etc , bueno ya se nota quien es el profesional   :D
La unica pega que he visto es cuando vuelve el foco al formulario principal, despues de seleccionar la imagen con el dialogo, las partes del formulario principal que tapaba el filedialog no se repintan y se quedan en negro, sera cuestion de hacerle un invalidate al form principal ....   :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 15 de Julio de 2006, 21:40
:lol:  jejeje gracias por los comentarios!!! :lol:  

Lo de profesional es inmerecido :S realmente estoy hasta ahora aprendiendo de C# 3.0 en el visual 2005 ya antes manejaba el 2003 pero muy poco de windows forms, solo directX y modo consola nada profundo... recien hace unos meses estoy profundizando para tratar de obtener una certificacion microsoft de aca a un año Dios mediante.

Lo de el invalidate  :ouch:  , de hecho lo tenia ahi pero lo removi porque crei que no era necesario, no habia fijado luego del bug que me decias, aunque ya lo vi... :losiento:

Aun estoy afinando la documentacion, pues he tenido problemas con el ndoc para .net framework 2.0.  :scream:
Título: Re: Formato Bmp
Publicado por: Danielo en Sábado 15 de Julio de 2006, 22:38
Citar
verigua en gdi acerca de lock bytes
No encontré mucho sobre lock bytes, pero por lo poco que vi y entendí  :(  me parece que  :think:  ¿es para trabajar con DirectX?

Citar
http://winapi.conclase.net/
Excelente página!!!... es con la que vengo aprendiendo desde el principio del reto ya que está todo muy bien explicado.

Y ya encontré una función similar a PutPixel  :jumpie: , en GDI se llama SetPixel y su sintaxis es:
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 y del pixel
  5.     COLORREF crColor  // color del pixel
  6.    );
  7.  

Aún no la he probado (falta de tiempo), pero creo que funcionará  :rolleyes:
Título: Re: Formato Bmp
Publicado por: inforsystem en Domingo 16 de Julio de 2006, 01:58
Hola a todos.
Soy el que escribio el codigo que interezó a muchos.Perdón por no responder antes.

Aqui les presento otro:

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

Este codigo, como el otro ¿que solucionan?Como habran observado aquellas personas que les sucedia que la imagen de dibugaba mal(como pixeles agitados por el viento), el ancho de la imagen o, el alto de la misma, termina en nùmero impar.

saludos a todos.
Título: Re: Formato Bmp
Publicado por: inforsystem en Domingo 16 de Julio de 2006, 02:03
Cita de: "Danielo"
Citar
verigua en gdi acerca de lock bytes
No encontré mucho sobre lock bytes, pero por lo poco que vi y entendí  :(  me parece que  :think:  ¿es para trabajar con DirectX?

Citar
http://winapi.conclase.net/
Excelente página!!!... es con la que vengo aprendiendo desde el principio del reto ya que está todo muy bien explicado.

Y ya encontré una función similar a PutPixel  :jumpie: , en GDI se llama SetPixel y su sintaxis es:
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 y del pixel
  5.     COLORREF crColor  // color del pixel
  6.    );
  7.  

Aún no la he probado (falta de tiempo), pero creo que funcionará  :rolleyes:
Hola Geo:
Te doy un consejo: utiliza la funcion SetPixelV que es mas rapida ¿por que? porque no devuelve un valor COLORREF;

Si necesitas saber como dibujar con funciones independientes a dispositivos ( las funciones que tiene las letras DIB) dimelo y te respondere a la brevedad.

saludos.
Título: Re: Formato Bmp
Publicado por: inforsystem en Domingo 16 de Julio de 2006, 02:09
Cita de: "Diodo"
La unica pega que he visto es cuando vuelve el foco al formulario principal, despues de seleccionar la imagen con el dialogo, las partes del formulario principal que tapaba el filedialog no se repintan y se quedan en negro, sera cuestion de hacerle un invalidate al form principal ....   :hola:
Hola.
No se si utilizan Visual Basic, pero para los que utilizan VC++ puede que les suceda lo mismo, entonces, pueden colocarl el flag CS_SAVEBITS en la estructura WNDCLASSEX;
El sistema operativo guarda una copia, por eso, ten en cuenta el uso de memoria.

saludos.
Título: Re: Formato Bmp
Publicado por: inforsystem en Domingo 16 de Julio de 2006, 02:22
Cita de: "Danielo"
solo encuentro cosas como LoadImage y LoadBitmap que por lo visto cargan el bitmap automagicamente y no a partir de una matriz de bits...
 
Hola:
Para visualizar bitmaps en un HDC con las funciones LoadBitmap, debes utilizar funciones como SelectObject y DeleteObject.
...
HBITMAP hBmp =  LoadBitmap(...);

HOBJ  hBmpOld = SelectObject(hdc, hbmp);
...

Pero recuerda eliminarlo despues para liberar memoria.

....
DeleteObject(hBmpOld);
...
o puedes usarlo asi:
...
DeleteObject(SelectObject(hdc,hBmp));
...

Saludos.
Título: Re: Formato Bmp
Publicado por: Geo en Domingo 16 de Julio de 2006, 06:41
Cita de: "inforsystem"
Hola Geo:
Te doy un consejo: utiliza la funcion SetPixelV que es mas rapida ¿por que? porque no devuelve un valor COLORREF;

Si necesitas saber como dibujar con funciones independientes a dispositivos ( las funciones que tiene las letras DIB) dimelo y te respondere a la brevedad.

saludos.
Jeje, Danielo es quien está trabajando con la WinAPI, yo estoy con wxWidgets :P.

Lo que tengo:Bien, a más tardar en un par de días mando mi programa para Linux :D.

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: JuanK en Domingo 16 de Julio de 2006, 07:18
Cita de: "inforsystem"
Cita de: "Diodo"
La unica pega que he visto es cuando vuelve el foco al formulario principal, despues de seleccionar la imagen con el dialogo, las partes del formulario principal que tapaba el filedialog no se repintan y se quedan en negro, sera cuestion de hacerle un invalidate al form principal ....   :hola:
Hola.
No se si utilizan Visual Basic, pero para los que utilizan VC++ puede que les suceda lo mismo, entonces, pueden colocarl el flag CS_SAVEBITS en la estructura WNDCLASSEX;
El sistema operativo guarda una copia, por eso, ten en cuenta el uso de memoria.

saludos.
No, Diodo y Yo hemos usado C#.NET, Danielo y Geo C++, Eugenio Enko ha usado Pascal ( Delphi).

Y tu... vas a participar?
Título: Re: Formato Bmp
Publicado por: Nagisa en Domingo 16 de Julio de 2006, 14:24
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:
Título: Re: Formato Bmp
Publicado por: JuanK en Domingo 16 de Julio de 2006, 14:57
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.
Título: Re: Formato Bmp
Publicado por: Danielo en Lunes 17 de Julio de 2006, 16:32
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.
Título: Re: Formato Bmp
Publicado por: Nagisa en Lunes 17 de Julio de 2006, 17:40
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!!
Título: Re: Formato Bmp
Publicado por: Geo en Lunes 17 de Julio de 2006, 18:39
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 (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/colors_8bvm.asp)

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Nagisa en Lunes 17 de Julio de 2006, 23:10
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...
Título: Re: Formato Bmp
Publicado por: Danielo en Martes 18 de Julio de 2006, 02:36
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 &#62; 0; y--) {
  9.    for(x = 0; x &#60; ancho*3; x++)    
  10.     cargarMatrizBMP(y-1,x,fgetc(arch),bmp);
  11.     for(x = 0; x &#60; 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-&#62;matriz[x][y]=valor;
  3. }
  4.  
Título: Re: Formato Bmp
Publicado por: Geo en Martes 18 de Julio de 2006, 06:00
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 &#62; 0; y--) {
  3.   for(x = 0; x &#60; ancho*3; x++)    
  4.    cargarMatrizBMP(y-1,x,fgetc(arch),bmp);
  5.    for(x = 0; x &#60; 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 &#60; alto; y++ ) {
  7.   for( x = 0; x &#60; 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 &#62;= 0; y-- ) {
  6.     for ( x = 0; x &#60; 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 &#60; 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 &#60; ancho; x++ )
  4.     SetPixel( hdc, x, y, matriz[ y ][ x ];
  5.  
  6.  
  7.  

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: inforsystem en Miércoles 19 de Julio de 2006, 04:29
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:
Título: Re: Formato Bmp
Publicado por: inforsystem en Miércoles 19 de Julio de 2006, 05:30
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
Título: Re: Formato Bmp
Publicado por: senzao18 en Miércoles 19 de Julio de 2006, 17:25
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:
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 19 de Julio de 2006, 17:34
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.  
Título: Re: Formato Bmp
Publicado por: Geo en Miércoles 19 de Julio de 2006, 18:43
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:Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Nagisa en Miércoles 19 de Julio de 2006, 18:43
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!
Título: Re: Formato Bmp
Publicado por: senzao18 en Miércoles 19 de Julio de 2006, 19:20
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.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 19 de Julio de 2006, 20:38
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.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 19 de Julio de 2006, 20:42
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.
Título: Re: Formato Bmp
Publicado por: senzao18 en Miércoles 19 de Julio de 2006, 21:56
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.
Título: Re: Formato Bmp
Publicado por: Danielo en Jueves 20 de Julio de 2006, 03:59
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
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 20 de Julio de 2006, 04:33
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
Título: Re: Formato Bmp
Publicado por: senzao18 en Jueves 20 de Julio de 2006, 07:39
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 :(.
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 20 de Julio de 2006, 08:23
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 | &
Título: Re: Formato Bmp
Publicado por: Enko en Jueves 20 de Julio de 2006, 14:13
Citar
He resuelto lo del padding despues de tanto buscar en internet jejee
Acaso nadie lee los posts del thread? :devil:
Título: Re: Formato Bmp
Publicado por: senzao18 en Jueves 20 de Julio de 2006, 17:08
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.
Título: Re: Formato Bmp
Publicado por: Geo en Jueves 20 de Julio de 2006, 17:43
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).
Título: Re: Formato Bmp
Publicado por: senzao18 en Jueves 20 de Julio de 2006, 17:50
Estoy usando VB.Net.

Logre hacerlo con la clase BinaryReader.

Muchas gracias por tu aporte.
Título: Re: Formato Bmp
Publicado por: Geo en Jueves 20 de Julio de 2006, 17:54
Cita de: "Geo"
Una cosa, ¿con qué lenguaje estás trabajando :D?
Cita de: "senzao18"
Estoy usando VB.Net.
Jaja, a ver si pongo más atención a los títulos en los nicks :P.
Título: Re: Formato Bmp
Publicado por: senzao18 en Jueves 20 de Julio de 2006, 18:17
Cita de: "Geo"
Cita de: "Geo"
Una cosa, ¿con qué lenguaje estás trabajando :D?
Cita de: "senzao18"
Estoy usando VB.Net.
Jaja, a ver si pongo más atención a los títulos en los nicks :P.
Jajaja pues yo creo que si....

Una preguntilla. Con que imagenes me deberia de fallar el programa ya probe con la de JuanK y una jpg que teniamos que pasar a BMP y salen bien.

JuanK o alguien, En la salida a que te refieres con retroalimentacion cuando la imagen no es del formato especificado?
Título: Re: Formato Bmp
Publicado por: senzao18 en Jueves 20 de Julio de 2006, 21:27
Pues ya lo envie JuanK espero esté bien  :P  :whistling:
Título: Re: Formato Bmp
Publicado por: JuanK en Jueves 20 de Julio de 2006, 21:29
sele debe informar al usuario, eso es retroalimentacion.

Por ejemplo: si no es una ext bmp se le debe infromar o si el identificador no corresponde a un bmp tambien.
Título: Re: Formato Bmp
Publicado por: Nagisa en Viernes 21 de Julio de 2006, 18:43
Cita de: "JuanK"
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.
Si, son los que te mande...
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 22 de Julio de 2006, 19:52
Cita de: Nagisa,Julio 21, 2006 11:43 am
Pero aun no me has enviado tus fuentes actualizados.
Si, son los que te mande... [/QUOTE]
Ok, ya lo recibi.

Hasta el momento he recibido los programas de:

Nagisa
Diodo
Enko
Geo
Zenzao18

Juank  :smartass:

Aparentemente solo falta Danielo amenos que alguien mas confirme y terminamos.

Ya cada cual sabe las debilidades y fortalezas de sus programas, asi que si desean hacer algun ajuste final, pueden hacerlo entes de que entregue Daniel, ya que en ese momento se cierra el reto.

 :hola:
Título: Re: Formato Bmp
Publicado por: Danielo en Sábado 22 de Julio de 2006, 21:16
Estoy teniendo lío con la parte de cargar el bmp desde cualquier ubicación, primero se me ocurrió utilizar un treeview para obtener la ruta y un listbox para obtener el nombre del archivo. El tema es que como lo estoy haciendo con el API no me está resultando para nada sencillo.
Ahora estoy intentando con un cuadro de diálogo que contiene 2 controles edit, uno para introducir manualmente la ruta y el otro para el nombre del bmp y 2 botones (Aceptar y Cancelar). Cuando escribo la ruta y el nombre se que están funcionando porque las puedo ver con un MessageBox, pero a la hora de asignarle la ruta al procedimiento que me carga el bitmap me da error, debido a que tiene que estar necesariamente entre:

Código: Text
  1. case WM_PAINT:
  2.            ...
  3.            ...
  4.            break;
  5.  

y el botón Aceptar está dentro de:
Código: Text
  1. WM_COMMAND:
  2.            ...
  3.            ...
  4.            break;
  5.  

o sea, no veo la forma de ejecutar lo que está dentro del WM_PAINT desde dentro del WM_COMMAND

intuyo que la solución debe estar en hacer una función que retorne la ruta y nombre de archivo obtenida a partir del cuadro de diálogo, pero por ahora no se me ocurre como hacerla  :(
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 22 de Julio de 2006, 22:19
para una solucion mas limpia yo tendria que ver mejor tu codigo... y hace rato que no hago nada con la win32  Bored API.

pero por el momento, porque no usas una variable global? :smartass:
Título: Re: Formato Bmp
Publicado por: Geo en Domingo 23 de Julio de 2006, 05:26
Yo usaría una variable global (no he programado una aplicación con la WinAPI), y para obtener el nombre del archivo mediante un diálogo:

GetOpenFileName Function (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/CommonDialogBoxLibrary/CommonDialogBoxReference/CommonDialogBoxFunctions/GetOpenFileName.asp)

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Danielo en Lunes 24 de Julio de 2006, 05:37
Cita de: "Geo"
Yo usaría una variable global (no he programado una aplicación con la WinAPI), y para obtener el nombre del archivo mediante un diálogo:

GetOpenFileName Function (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/CommonDialogBoxLibrary/CommonDialogBoxReference/CommonDialogBoxFunctions/GetOpenFileName.asp)

Saludos,
JJ (Geo).
ya me parecía raro que no existiera algo parecido a los InputBox :D .
Buena idea lo de la variable global, vengo intentandolo desde hace un buen rato  :(  y ahora me doy cuenta donde estaba la falla: por alguna extraña razón la maravillosa función GetOpenFileName retorna rutas como por ejemplo esta:

c:\imagenes\archivo.bmp

y me estaba dando error porque mi procedimiento de cargar bitmpap:

imagenBMP *CargarBitmapArchivo(char nombreArchivo[]);

espera: c:\\imagenes\\archivo.bmp

ahora me doy cuenta que el carácter "\" al ser un carácter de escape, era lo que me estaba dando problemas  <_< .

Viendo la documentación de GetOpenFileName parecería que no hay forma de convertir la ruta al "formato" que entiende mi CargarBitmapArchivo, así que a menos que alguien me diga lo contrario creo que no tendré más remedio que implementar un procedimiento que solucione el problema del carcacter de escape "\"
Título: Re: Formato Bmp
Publicado por: Enko en Lunes 24 de Julio de 2006, 13:53
Que yo recuerde, '\' se usa para poner despes los caracteres especiales, pero solo desde el compilador.
Si no me equivoco, si la entrada se hace por teclado, es decir por el usuario, en tiempo de ejecucion, la barra '\' es un caracter m'as.
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 24 de Julio de 2006, 14:17
asi es. :comp:
Título: Re: Formato Bmp
Publicado por: Enko en Lunes 24 de Julio de 2006, 14:44
Cita de: "JuanK"
asi es. :comp:
Entonces cual es el problema que tiene Danielo  :blink:
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 24 de Julio de 2006, 14:45
Saludos,
con motivo que Geo me envio su programa con WxWidgets y C++ y me lo paso en versiones linux y windows y funciono OK, me propuse a revisar mejor lo del proyecto Mono (http://www.mono-project.com/Main_Page) asi que trate de ejecutar mis 2 proyectos del reto hechos en C# en un linux ubunto y no me funciono :'(...

la razon resulta que el runtime de mono en el momento solo soporta hasta C# 1.1, el soporte para C# 2.0 aun no esta completo y desde luego mis programas se compilaron con C# 2.0.

Asi que decidi instalar el monodevelop en linux ubuntu , cree un proyecto con mis fuentes de la libreria que hice y la compile...  compilo perfecto!!!  :lol:

Despues procedi a compilar los dos proyectos que hice para el reto, el extra y el de la entrega, el Extra compilo perfecto y funciono perfecto , pero el del reto no porque utiliza  cosas de C# 2.0, pude haber instalado el  gmcs ( el compilador de mono para c# 2.0) pero no porque eso implicaria invertirle mas tiempo, sin embargo vi la documentacion y verifique que el unico error por el que no compilabara ya esta soportado en C# 2.0 para mono.

Lo mas interesante fue que coji mi libreria y el aplicativo compilado en linux ubuntu con C#1.1 y me lleve el ejecutable tal como se genero en linux y me funciono en windosw XP  sin hacerle nada :o  ya que al tener en windows XP instalado el runtime del .net framework 2.0 tengo soporte para todas las versiones anteriores de c# :D.

Hice la prueba invertida, busque en mi pc algunos proyecto antiguos que tenia de C# 1.1 , un hola mundo y otra aplicacion de consola, y me lleve los exe tal cual a linux ubuntu... funcionaron de inmediadto... de maravilla  :lol:
Título: Re: Formato Bmp
Publicado por: Danielo en Lunes 24 de Julio de 2006, 15:05
Lo que pasa es que cuando se abre un fichero en C++ con fopen y el archivo tiene path, hay que abrirlo así :(  :
Código: Text
  1. FILE* handle = fopen(&#34;D:&#092;&#092;path-name&#092;&#092;fichero.nnn&#34;, &#34;r+b&#34;);
  2.  
más info en: http://www.zator.com/Cpp/E5_5_2a.htm (http://www.zator.com/Cpp/E5_5_2a.htm)
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 24 de Julio de 2006, 15:06
<_<  Antes de que me digan nada ya mire que ya esta disponible el compilador gms completo , de hecho esta comom opcion por defecto  :huh:

Lo que pasa es que me da mucha pereza este cuento de linux,  para evitarme la fatiga lo habia instalado desde synaptic pero al parecer no todos los paquetes que oferecn estan actualizadod... pero estoy bajando el binario a ver si esta noche hago el deber... lo que si ya esta confirmado es que monodevelop no soportara c# 2.0 hsta que no se libere la version 1.0 de monodevelop lo cual no se cuando sera... :whistling: asi que tendre que compilar por linea de comandos... y con la manotada de referencias que usé  -_-
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 24 de Julio de 2006, 15:08
Cita de: "Danielo"
Lo que pasa es que cuando se abre un fichero en C++ con fopen y el archivo tiene path, hay que abrirlo así :(  :
Código: Text
  1. FILE* handle = fopen(&#34;D:&#092;&#092;path-name&#092;&#092;fichero.nnn&#34;, &#34;r+b&#34;);
  2.  
más info en: http://www.zator.com/Cpp/E5_5_2a.htm (http://www.zator.com/Cpp/E5_5_2a.htm)
sigo sin entender tu problema... es decir y que hay con eso. por eso no te puede fallar  ;)
Título: Re: Formato Bmp
Publicado por: Danielo en Lunes 24 de Julio de 2006, 16:24
Cita de: "JuanK"
Cita de: "Danielo"
Lo que pasa es que cuando se abre un fichero en C++ con fopen y el archivo tiene path, hay que abrirlo así :(  :
Código: Text
  1. FILE* handle = fopen(&#34;D:&#092;&#092;path-name&#092;&#092;fichero.nnn&#34;, &#34;r+b&#34;);
  2.  
más info en: http://www.zator.com/Cpp/E5_5_2a.htm (http://www.zator.com/Cpp/E5_5_2a.htm)
sigo sin entender tu problema... es decir y que hay con eso. por eso no te puede fallar  ;)
si no está fallando eso, el error debe estar por otro lado y me temo que es porque el procedimiento que muestra el bitmap en pantalla no puede recibir la ruta y el archivo a cargar:
Código: Text
  1. /*  Esta función es invocada por la función DispatchMessage()  */
  2. LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  3. {
  4. OPENFILENAME ofn;       // common dialog box structure
  5. char szFile[260];       // buffer for file name
  6. HANDLE hf;              // file handle
  7.  
  8. // Initialize OPENFILENAME
  9. ZeroMemory(&ofn, sizeof(ofn));
  10. ofn.lStructSize = sizeof(ofn);
  11. ofn.hwndOwner = hwnd;
  12. ofn.lpstrFile = szFile;
  13. //
  14. // Set lpstrFile[0] to '&#092;0' so that GetOpenFileName does not
  15. // use the contents of szFile to initialize itself.
  16. //
  17. ofn.lpstrFile[0] = '&#092;0';
  18. ofn.nMaxFile = sizeof(szFile);
  19. ofn.lpstrFilter = &#34;All&#092;0*.*&#092;0Text&#092;0*.TXT&#092;0&#34;;
  20. ofn.nFilterIndex = 1;
  21. ofn.lpstrFileTitle = NULL;
  22. ofn.nMaxFileTitle = 0;
  23. ofn.lpstrInitialDir = NULL;
  24. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  25.  
  26. static HINSTANCE hInstance; // inicializo instancia... no si sirve para algo
  27.  
  28. HDC hDC;
  29. PAINTSTRUCT ps;    
  30. unsigned long x,y;    
  31.  
  32.     switch (msg)                  /* manipulador del mensaje */
  33.     {
  34.         case WM_COMMAND:
  35.            switch(LOWORD(wParam)) {
  36.               case CM_ABRIR:
  37.                 // Display the Open dialog box.
  38.                 if (GetOpenFileName(&ofn)==TRUE){
  39.                   hf = CreateFile(ofn.lpstrFile, GENERIC_READ,0, (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
  40.                                    
  41.                 MessageBox(hwnd, szFile, &#34;Mensaje de prueba&#34;, MB_OK); // Muestra ruta del bitmap
  42.                 imagenBMP *bmp=CargarBitmapArchivo(szFile);
  43.                  hDC = BeginPaint(hwnd, &ps);
  44.                  for(y =0;y&#60; getAltoBitmap(bmp); y++){
  45.                   for(x = 0; x &#60; getAnchoBitmap(bmp); x++)
  46.                   SetPixelV(hDC,x,y,getPixelMatrizBMP(y,x,bmp));
  47.                  }
  48.                  EndPaint(hwnd, &ps);
  49.                 }
  50.                 break;
  51.               case CM_SALIR:                
  52.                  PostQuitMessage(0);    /* envía un mensaje WM_QUIT a la cola de mensajes */
  53.                  break;
  54.            }
  55.            break;  
  56.         case WM_DESTROY:
  57.            PostQuitMessage(0);    /* envía un mensaje WM_QUIT a la cola de mensajes */
  58.            break;
  59.         default:                  /* para los mensajes de los que no nos ocupamos */
  60.            return DefWindowProc(hwnd, msg, wParam, lParam);
  61.     }
  62.     return 0;
  63. }
  64.  
Mi programa, tiene un menú sencillo que por ahora solo tiene la opción de Abrir y Salir, entonces, cuando selecciono Abrir se ejecuta GetOpenFileName y obtengo la ruta y nombre del bitmap a mostrar en pantalla, luego veo la ruta con un messagebox y se ve correctamente.
El problema tal vez viene en el paso siguiente ya que me sale un mensaje que dice:
"se ha detectado un problema y debe cerrarse"

Aparentemente lo que pasa es que salta el error cuando se procesa:

imagenBMP *bmp=CargarBitmapArchivo(szFile);

Esta función lo que hace es leer los datos del bitmap y funciona bien porque la he probado, es por eso que en un principio pensé que el path y el archivo que vienen en szFile no estaban siendo bien interpretados por fopen (función que se encuentra detro de CargarBitmapArchivo.

Tal vez no es dentro del case CM_ABRIR que tengo que escribir el codigo de mostrar  el bitmap en pantalla, no lo se. He intentado escribir ese mismo código en el case CM_PAINT y tampoco funciona bien :(
Título: Re: Formato Bmp
Publicado por: Geo en Lunes 24 de Julio de 2006, 17:36
Cita de: "JuanK"
Saludos,
con motivo que Geo me envio su programa con WxWidgets y C++ y me lo paso en versiones linux y windows y funciono OK, me propuse a revisar mejor lo del proyecto Mono (http://www.mono-project.com/Main_Page) asi que trate de ejecutar mis 2 proyectos del reto hechos en C# en un linux ubunto y no me funciono :'(...

la razon resulta que el runtime de mono en el momento solo soporta hasta C# 1.1, el soporte para C# 2.0 aun no esta completo y desde luego mis programas se compilaron con C# 2.0.

Asi que decidi instalar el monodevelop en linux ubuntu , cree un proyecto con mis fuentes de la libreria que hice y la compile...  compilo perfecto!!!  :lol:

Despues procedi a compilar los dos proyectos que hice para el reto, el extra y el de la entrega, el Extra compilo perfecto y funciono perfecto , pero el del reto no porque utiliza  cosas de C# 2.0, pude haber instalado el  gmcs ( el compilador de mono para c# 2.0) pero no porque eso implicaria invertirle mas tiempo, sin embargo vi la documentacion y verifique que el unico error por el que no compilabara ya esta soportado en C# 2.0 para mono.

Lo mas interesante fue que coji mi libreria y el aplicativo compilado en linux ubuntu con C#1.1 y me lleve el ejecutable tal como se genero en linux y me funciono en windosw XP  sin hacerle nada :o  ya que al tener en windows XP instalado el runtime del .net framework 2.0 tengo soporte para todas las versiones anteriores de c# :D.

Hice la prueba invertida, busque en mi pc algunos proyecto antiguos que tenia de C# 1.1 , un hola mundo y otra aplicacion de consola, y me lleve los exe tal cual a linux ubuntu... funcionaron de inmediadto... de maravilla  :lol:
Jeje, se me olvidó comentarte :P. Cuando me pasaste tu código, lo compilé en Ubuntu instalando monodevelop, la librería compiló sin muchos problemas, el problema fué cuando intenté con tu aplicación principal, chequé documentación y versiones, no recuerdo si era algo con Windows.Forms (y también con las características del 2.0), así que ya no le busqué (te repito, no sé C# aunque poco a poco me voy metiendo :D).

Es muy común que en los repositorios no cuentes con las últimas versiones de algún programa/librería, ya que pasan por un proceso de "candidato->estable", aunque hasta ahora desconozco el proceso real de integración de un paquete a Ubuntu y a Debian.

Lo de tu ejecutable que funciona en Windows, era una de las cosas que me preguntaba pues, cuando compilé con mono, vi que le agrega la extensión .exe a los programas, chequé el formato del ejecutable resultante y dice ¡ejecutable de Windows  :blink:!

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: JuanK en Lunes 24 de Julio de 2006, 17:43
claro asi es,  de hecho corrobore que cualquier ejecutable compilado en una u otra plataforma corre sin problemas en la otra sn necesidad de compilar de nuevo, salvo problemas de version como los que comente.

Incluso mono te permite generar una version de ejecutable para linux, supongo que para poder ejecutarlos como un programa linux normal sin tener que anteponer la palabra mono.
Título: Re: Formato Bmp
Publicado por: Danielo en Miércoles 26 de Julio de 2006, 15:49
lamentablemente... sigo teniendo problemas con la ruta del bitmap  :(
Mi último intento un poco más coherente y entendible que el anterior ;) es el siguiente:
Código: Text
  1.  
  2. LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  3. {
  4. OPENFILENAME ofn;       // common dialog box structure
  5. static char szFile[260];       // buffer for file name
  6. //HWND hwnd;              // owner window
  7. HANDLE hf;              // file handle
  8.  
  9. // Initialize OPENFILENAME
  10. ZeroMemory(&ofn, sizeof(ofn));
  11. ofn.lStructSize = sizeof(OPENFILENAME);//sizeof(ofn);
  12. ofn.hwndOwner = hwnd;
  13. ofn.lpstrFile = szFile;
  14. //
  15. // Set lpstrFile[0] to '&#092;0' so that GetOpenFileName does not
  16. // use the contents of szFile to initialize itself.
  17. //
  18. //ofn.lpstrFile[0] = '&#092;0';
  19. ofn.nMaxFile = sizeof(szFile);
  20. ofn.lpstrFilter = &#34;bmp&#092;0*.BMP&#092;0&#34;;
  21. ofn.nFilterIndex = 1;
  22. ofn.lpstrFileTitle = NULL;
  23. ofn.nMaxFileTitle = 0;
  24. ofn.lpstrInitialDir = NULL;
  25. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  26.  
  27.  
  28. static HINSTANCE hInstance; // inicializo instancia.
  29.  
  30. HDC hDC;
  31. PAINTSTRUCT ps;    
  32. unsigned long x,y;    
  33. static imagenBMP *bmp;
  34. static bool dibujarBMP=false;
  35.  
  36.  
  37.     switch (msg)                  /* manipulador del mensaje */
  38.     {
  39.         case WM_CREATE:
  40.          hInstance = ((LPCREATESTRUCT)lParam)-&#62;hInstance;
  41.          break;
  42.         case WM_PAINT:      
  43.          if (dibujarBMP){
  44.           //bmp=CargarBitmapArchivo(&#34;E:&#092;&#092;img&#092;&#092;graf1.bmp&#34;);                              
  45.           bmp=CargarBitmapArchivo(szFile);                                        
  46.           hDC = BeginPaint(hwnd, &ps);
  47.           TextOut(hDC, 10, 300, szFile, strlen(szFile));            
  48.           for(y =0;y&#60; getAltoBitmap(bmp); y++){
  49.            for(x = 0; x &#60; getAnchoBitmap(bmp); x++)
  50.              SetPixel(hDC,x,y,getPixelMatrizBMP(y,x,bmp));
  51.           }          
  52.           EndPaint(hwnd, &ps);
  53.           dibujarBMP=false;
  54.           }  
  55.          break;
  56.         case WM_COMMAND:
  57.            switch(LOWORD(wParam)) {
  58.               case CM_ABRIR:
  59.                 // Display the Open dialog box.
  60.                 if (GetOpenFileName(&ofn)==TRUE){
  61.                   hf = CreateFile(ofn.lpstrFile, GENERIC_READ,0, (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);                                                
  62.                   dibujarBMP=true;                                              
  63.                   MessageBox(hwnd,szFile, &#34;Mensaje de prueba&#34;, MB_OK);                  
  64.                 }
  65.                 break;
  66.               case CM_SALIR:
  67.                  PostQuitMessage(0);    /* envía un mensaje WM_QUIT a la cola de mensajes */
  68.                  break;
  69.            }
  70.            break;  
  71.         case WM_DESTROY:
  72.            PostQuitMessage(0);    /* envía un mensaje WM_QUIT a la cola de mensajes */
  73.            break;
  74.         default:                  /* para los mensajes de los que no nos ocupamos */
  75.            return DefWindowProc(hwnd, msg, wParam, lParam);
  76.     }
  77.     return 0;
  78. }
  79.  
Por lo que he leido necesariamente el código que dibuja el bitmap en pantalla tiene que estar en WM_PAINT, pero para pasarle la ruta del archivo que quiero cargar tengo que controlar con un booleano que se inicializa a true cuando se selecciona el archivo a cargar con GetOpenFileName. Lo que está pasando y siempre me ha pasado y me sigue dando error  :angry:  es que la variable szFile (que tiene almacenada la ruta del bitmap) no parece llegar al WM_PAINT. Llegue a pensar que podria estar pasando que llegara con caracteres basura, pero aparentemente no es eso, tambien he intentado limpiar la cadena y nada, tampoco funciona una variable global.

Sin embargo, si anulo la linea: bmp=CargarBitmapArchivo(szFile);
y habilito: bmp=CargarBitmapArchivo("E:\\img\\graf1.bmp");
se carga correctamente graf1.bmp y lo mas extraño es que: TextOut(hDC, 10, 300, szFile, strlen(szFile)); muestra en pantalla cualquier ruta que seleccione con
GetOpenFileName. Entonces si el TextOut está mostrando la ruta  correctamente, ¿por qué razón no funciona bien szFile?... ya no se que pensar...  :(
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 26 de Julio de 2006, 16:00
y le has hecho debug paso a paso?

que cadena esta llegando al propceso del bitmap cuando ocurre el llamado?  :rolleyes:
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 26 de Julio de 2006, 16:06
Ya probaste abriendolo con ofn.lpstrFile?

tambien es conveniente que le hagas un

ZeroMemory (szFile)

o bien un

memset(szFile,'\0',sizeof(szFile))

Ademas debes verificar y estar seguro que la cantidad de caracteres del path , en tu caso nunca supere los 259 caracteres, o bien cambiar la forma en que defines el ancho de la cadena porque esta algo limitado.
Título: Re: Formato Bmp
Publicado por: Danielo en Miércoles 26 de Julio de 2006, 23:40
Cita de: "JuanK"
y le has hecho debug paso a paso?

que cadena esta llegando al propceso del bitmap cuando ocurre el llamado?  :rolleyes:
si, intenté con el debug que viene con el dev-cpp, previamente habiendo marcado en las opciones del compilador la opción para que generara la información de debug al linkear, el tema es que por más que intento hacerle un watch a la variable szFile o ofn.lpstrFile o a la que sea, no quiere aceptar las variables (al seleccionar añadir watch). Se me ocurrió entonces que tal vez el gdb no era el último y efectivamente, busque entre las actualizaciones y veo que está el GNU gdb 6.3 y el que tenía antes era el 5.1, pero lo actualicé y sigo sin poder hacer watch y sin poder debugear paso a paso, cosa que no sucede si intento debugear cualquier código que corra en DOS.

Citar
que cadena esta llegando al propceso del bitmap cuando ocurre el llamado?
Como no puedo utilizar el debug  :(  lo que hice fue colocar un message box antes de que se haga el llamado al bitmap:

Código: Text
  1. MessageBox(hwnd,szFile, &#34;valor de szFile&#34;, MB_OK);
  2.           bmp=CargarBitmapArchivo(szFile);
  3.  
... y el message box esta desplegando la ruta correctamente al igual que la etiqueta:
Código: Text
  1. TextOut(hDC, 10, 300, szFile, strlen(szFile));
  2.  
... que dibuja en pantalla la cadena del path.

Probé con ofn.lpstrFile en lugar de szFile y no se soluciona nada, y tambien haciendo:
Código: Text
  1. ZeroMemory(&szFile, sizeof(szFile)); o memset(szFile,'&#092;0',sizeof(szFile));
  2.  
En este último caso, la cosa empeora porque si agrego alguna de esas líneas de código al correr el ejecutable explota en la línea TextOut(hDC...

Citar
Ademas debes verificar y estar seguro que la cantidad de caracteres del path , en tu caso nunca supere los 259 caracteres, o bien cambiar la forma en que defines el ancho de la cadena porque esta algo limitado.
Si, esto es algo que supongo se podría mejorar, pero por el momento no estoy probando con rutas de más de 259 caracteres, como mucho tendrán unos 20 caracteres, así que no creo que esté fallando por ese lado.

También intenté limpiando (por las dudas) la cadena szFile:
Código: Text
  1. char cadena[strlen(szFile)];  
  2. strncpy(cadena,szFile,strlen(szFile));
  3. cadena[strlen(szFile)]='&#092;0';
  4.  
... y tampoco :(

Y por el momento eso es todo lo que he intentado, acepto sugerencias, críticas, etc.
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 26 de Julio de 2006, 23:48
sugerencia...
1- Consiguete un compilador mejor, descargate el visual C++ .net express desde la pagina de microsoft o quie se yo el que quieras pero cambia el que tienes.

2- Enviame tu codigo a mi mail en un archivo .rar lo revisare y tratare de detectar donde esta el problema para que lo corrijas.  :smartass:

juank.ruiz@gmail.com
Título: Re: Formato Bmp
Publicado por: Danielo en Jueves 27 de Julio de 2006, 00:27
Cita de: "JuanK"
sugerencia...
1- Consiguete un compilador mejor, descargate el visual C++ .net express desde la pagina de microsoft o quie se yo el que quieras pero cambia el que tienes.

2- Enviame tu codigo a mi mail en un archivo .rar lo revisare y tratare de detectar donde esta el problema para que lo corrijas.  :smartass:

juank.ruiz@gmail.com
Muchas gracias por tu interés y ayuda JuanK, pero... acabo de descubrir donde estaba el ERROR :jumpie:

En el procedimiento WindowProcedure, en la parte en que se inicializa el OPENFILENAME (Initialize OPENFILENAME), hay una línea que dice: ofn.hwndOwner = hwnd;
bueno, si quito u oculto esa línea... se soluciona el problema!!... la verdad que no sé muy bien porqué se soluciona, tal vez porque el cabezal de WindowProcedure ya contiene una variable de tipo HWND y al hacer ofn.hwndOwner = hwnd; se inicializaba algo que no debía. Sea como sea, si no surge algún otro imprevisto te puedo decir que ahora casi estoy por terminar el reto, me faltan agregar unas cosillas menores (eso espero :blink: ) y listo.
Título: Re: Formato Bmp
Publicado por: Danielo en Viernes 28 de Julio de 2006, 00:30
cada vez me falta menos :rolleyes:
Ahora necesito refrescar la pantalla para que se actualice el bitmap cuando cargo algún otro por segunda vez. He intentado destruyendo la estructura que contiene el bitmap pero perecería que no basta con eso, ya que el primer bitmap cargado que aparece en pantalla queda fijo... lo extraño es que si abro otra ventana y la coloco sobre el area en que aparece el dibujo...  éste desaparece (o mejor dicho se borra) :huh: y si vuelvo a cargar otro bitmap, se muestra correctamente en pantalla  :think:

Se me ocurrió hacer algo como esto:
Código: Text
  1.  
  2. ...
  3. case WM_PAINT:
  4.    ...
  5.    DeleteDC(hDC);
  6.    hDC = BeginPaint(hwnd, &ps);
  7.    ...
  8.    ...
  9.    EndPaint(hwnd, &ps);
  10.  
  11.  
... pero tampoco dió resultado :(
Título: Re: Formato Bmp
Publicado por: JuanK en Viernes 28 de Julio de 2006, 00:34
invalidate
usa invalidate para forzar el refresco de la ventana.
Título: Re: Formato Bmp
Publicado por: Danielo en Viernes 28 de Julio de 2006, 01:48
Cita de: "JuanK"
invalidate
usa invalidate para forzar el refresco de la ventana.
 :D Lo más parecido a invalidate que encontré fue:
Código: Text
  1.  
  2. BOOL InvalidateRect(
  3.     HWND hWnd,            // manipulador de la ventana con la región de actualización modificada  
  4.     CONST RECT * lpRect,  // dirección del rectángulo con las coordenadas
  5.     BOOL bErase           // flag de borrado de fondo
  6.    );
  7.  
  8.  
... tuve que crear un rectángulo con las dimensiones de la ventana y luego lo utilizo para refresar... y funciona!!! :D

Ahora... si minimizo la pantalla o si se superpone alguna otra ventana sobre la que contiene el bitmap, éste se borra  :angry:

Por lo que estuve leyendo, eso pasa porque SetPixelV está pintando sobre la memoria de video y no sobre la memoria ram <_<
Por lo que estuve leyendo parecería que esto se soluciona con la función BitBlt, así que intentaré utilizarla, a ver que pasa :unsure:
Título: Re: Formato Bmp
Publicado por: JuanK en Viernes 28 de Julio de 2006, 02:55
mejor hasle invalidate cada vez que la ventana recupere el foco, de esta manera se refrescara, eso es el evento activate o get focus.... depende de la implementacion...
Título: Re: Formato Bmp
Publicado por: Enko en Viernes 28 de Julio de 2006, 16:02
tambien puedes dibujar la imagen en un HDC de memoria, crear un Timer y en el evento WM_TIMER volcar el HDC de memoria en el HDC de la ventana.

con esto creas el buffer
Código: Text
  1.  
  2. hWindow := CreateWindow(........);
  3. WindowDC := GetDC(hWindow);
  4.  
  5. Bitmap := CreateCompatibleBitmap(WindowDC);
  6. VirtualScreen := CreateCompatibleDC(WindowDC);
  7. SelectObject(VirtualScreen, Bitmap);
  8.  
  9.  

para crear el timer
Código: Text
  1.  
  2. SetTimer(hWindow, hTimer, 0,1);
  3.  
  4.  

para dibujar en la pantalla vitual
Código: Text
  1.  
  2. SetPixel(VirtualScreen, etc....);
  3.  
  4.  

finalmente, el codigo del windProc para que la imagen siemrpe se dibuje
Código: Text
  1.  
  2. function WindProc(hWnd, MSG, wParam, lParam: Integer): Integer;
  3. begin
  4. case MSG if
  5.    WM_DESTROY:
  6.    begin
  7.      DeleteObject(Bitmap);
  8.      DeleteDC(VirtualScreen);
  9.    end;
  10.    WM_PAINT: BitBlt(WindowDC, 0,0,Width, Height, VitualScreen, 0,0); //break
  11.    WM_TIMER: SendMessage(hWnd, WM_PAINT, 0,0); //break
  12. end;
  13.  
  14.  
Título: Re: Formato Bmp
Publicado por: Danielo en Sábado 29 de Julio de 2006, 01:07
Gracias JuanK y Enko... :rolleyes:

... ya está terminado!! :jumpie:
Al final no fue necesario utilizar WM_ACTIVATE o set focus y tampoco fue necesario dibujar la imagen en un HDC de memoria. El problema que tenía con el refresco de pantalla era a causa del orden en que había declarado algunas variables, pero todo se solucionó declarándolas en el orden conveniente :smartass: .
Bueno, creo que eso es todo (JuanK: acabo de mandarte los archivos), agradezco a todos los que me ayudaron y ahora entiendo un poco como funciona la win32 Bored API  ;)
Título: Re: Formato Bmp
Publicado por: JuanK en Sábado 29 de Julio de 2006, 01:15
Cita de: "Danielo"
agradezco a todos los que me ayudaron y ahora entiendo un poco como funciona la win32 Bored API  ;)
JEJEJEJE  :lol:

Ok, entonces me tomare una o dos semanas para someter todos los retos a pruebas y elaborar un informe.  :smartass:  

:gracias:  a todos por su participación.

Cualquier duda este post sigue abierto hasta que se publiquen los resultados.

Este fin de semana sera tiempo habilitado para entregar nuevas versiones si alguien quiere hacerlo.:bravo:  


 :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Martes 15 de Agosto de 2006, 06:06
ok, todos los proyectos cumplieron con lo requerido.

Queria inicialmente hacer un analisis muy detallado de cada uno, pero por lo visto por estos dias el tiempo no esta a mi favor, asi que he hecho este resumen.


Puntos Favorables de cada proyecto:
Nagisa : Brevedad del codigo
Diodo  : Uso de tabs
Geo    : Salida mixta por consola y GUI
Enko   : Informe de excepciones
Danielo: Informacion adicional del mapa de bits
Senzao18: Sencilles, muy user friendly
JuanK  : N/A  

Puntos DesFavorables de cada proyecto:

Nagisa: Demasiado Lento ( me habias dicho que lo habias corregido? es que no tengo mas copias  :losiento: )
Diodo : En algunos casos muestra la imagen de forma irregular( me habias dicho que lo habias corregido? es que no tengo mas copias  :losiento: )
Geo   : WxWidgets es muy engorroso de usar, pero no es culpa tuya ( no sabia que mas escribir  :scream: )
Enko  : Demasiado lento
Danielo:Se revienta con bitmaps grandes
Senzao18: Demasiado lento
JuanK  :N/A

Clasificacion por tecnologia

.NET

Diodo(C#)
JuanK(C#)
Senzao18( VB.NET)

Delphi (pascal)
Enko

C/C++
Geo(WxWidGets)
Danielo (WinApi)

Java
Nagisa

About Me
No puedo  ser juez y parte por eso no hice comentarios acerca de mi reto.

Otros Comentarios

En general creo que todos hemos sacado provecho del ejercicio, y valio la pena invertir el tiempo  :smartass: .

Como notas adicionales , de los ejercicios de Geo puedo decir que me gusto su idea de usar WxWidgets ya que pude probar el programa en Windows y Linux ( mi aplicativo extra en C#.net tambien corrio en ambos), y es interesante explorar esas posibilidades en C++. En cuanto a rendimiento esta muy bien y pese a que no eres informatico  tienes buenos habitos de programacion.

El ejercicio de Danielo fue con la Win32Api, creo que esto le ha ayudado mucho a él ya que con este tipo de ejercicios y usando la tecnologia que usó podra desarrollar mas rapidamente sus habilidades como programador, creo que el crecioo enormemente con el ejercicio. El problema de la memoria debes revisarlo, me ocurrio con un bitmap grandecito.

Respecto al proyecto de Enko, creo que ha demostrado que tiene buenos conocimientos y manejo de delphi, asi como buenos habitos de programacion.,y que bueno que haya decidido a aventurarce en .NET.  :lol: . Aprendi que Delphi ( o pascal , como sea) es como un C++ pero con algo de la sintaxis de basic :P . Yo le mejoraria la interfaz y el rendimiento ya que esta lento pero se nota mucho con bmps grandes.
Muy bueno y saber quie tampoco eres informatico.

El proyecto de Nagisa se destaca principalmente por ser el de mas poco codigo, una implementacion realmente practica lo cual se le debe reconocer, adicionalmente es el unico proyecto que se hizo e java.  ;) Gracias a él muchos vimos lo del corrimiento de una manera muy eficiente, yo por lo menos lo hacia de otra manera pero me gusta mas la tuya.

Diodo utilizo C# .NET , la interfaz grafica que uso me ha gustado bastante, en especial el uso de tab pages me parece ideal.. solo falto poder cerrar los tab, pero bueno nada es perfecto  :smartass: El codigo es breve pese a la complejidad que le agregaste con lo de los tab . A  mi me gusto tu propuesta sobre todo a nivel grafico.

Senzao18 Utilizó VB.NET, me gusta del proyeco que ofrece una interfaz sencilla y que facilita su uso directo, en general me parecio  bien estructurado pero debo confesar que no me fueron del todo claro unas partes en cuanto al orden que le quiciste dar, el problema de la lentitud es por la tecnica que usaste para el dibujo, al igual que a los demas que se les llego a presentar ese problema, veraz que un cambio muy sencillo te produce una mejora considerable en los resultados.

JuanK...

Agradezco de verdad a todos su participacion, creo que todos son los mejores ganadores, por que todos asumieron y finalizaron el reto!!!

FELICITACIONES :smartass:  :beer:  :birthday:   :guitar:

Links de los proyectos:

JuanK (http://www.solocodigo.com/vftp/Retos/cargabmpmanualapp_by_juank.rar)

Nagisa (http://www.solocodigo.com/vftp/Retos/lectorbmp_by_nagisa.rar)

Diodo (http://www.solocodigo.com/vftp/Retos/loadbmp24_by_diodo.rar)

Geo (http://www.solocodigo.com/vftp/Retos/reto_geo.rar)

Danielo (http://www.solocodigo.com/vftp/Retos/retobmp24_danielo.rar)

Senzao18 (http://www.solocodigo.com/vftp/Retos/retosolocodigo_senzao18.rar)

Enko (http://www.solocodigo.com/vftp/Retos/ubitmap_by_enko.rar)



La discucion no se cierra, cualquier duda, o comentario favor no duden en compartirlo.  :kicking:
Título: Re: Formato Bmp
Publicado por: Diodo en Martes 15 de Agosto de 2006, 08:54
Esta bueno el informe   :good:

Citar
Diodo : En algunos casos muestra la imagen de forma irregular( me habias dicho que lo habias corregido? es que no tengo mas copias

Crei haberte mandado la ultima version que corregia el padding ( al menos en las 2 imagenes que pusisteis de prueba). De todas maneras no importa lo que queda es la ecxperiencia  :lol:  y ver otros codigos mejores siempre ayuda, cuando pueda echare un vistazo a los de los compañeros.

Si no te importa me gustaria publicarlo en el blog de Noticias(bueno si quieres hacerlo tu mejor que mejor, pero quizas estes apurado de tiempo) Lo que puedo hacer tambien es publicarlo y luego editarlo y ponerte como autor. Bueno ya me contaras lo que prefieres

salu2 a todos y enhorabuena por el trabajo
Título: Re: Formato Bmp
Publicado por: JuanK en Martes 15 de Agosto de 2006, 14:11
:lol: Prefiero que lo hagas tú, la verdad no he tenido mucho tiempo pero aunque traté de entrar no encontre por donde.  :scream:
Título: Re: Formato Bmp
Publicado por: senzao18 en Martes 15 de Agosto de 2006, 17:43
Pues gracias a todos por sus codigos espero poder checarlos este fin de semana jiji....

Y gracias a JuanK por sus comentarios, que creo que nos ayudaran a mejorar para el siguiente reto....

Que de seguro JuanK ya lo tiene planeado.

Solo falta que lo libere jaja. :hola:
Título: Re: Formato Bmp
Publicado por: JuanK en Martes 15 de Agosto de 2006, 17:54
si ya lo tengo listo, concertemos una fecha y lo publicare.
Título: Re: Formato Bmp
Publicado por: Nagisa en Martes 15 de Agosto de 2006, 22:14
Muchas gracias a JuanK por sus comentarios sobre todos los proyectos! Creo que es algo con lo que podemos aprender todos, y asi  es mas divertido :D

Estamos esperando el proximo!!  :lol:
Título: Re: Formato Bmp
Publicado por: Enko en Miércoles 16 de Agosto de 2006, 00:01
Gracias por los comentarios y por tomarte ese tiempo que sabemos que casi ni tienes.
Si ese reto se hubiera hecho hace un año, me hubiera dado miedo imaginarme leer el bmp, pero ahora, resulto más facil de lo que creía si no fuera por el padding.

Estaría bueno hacer un reto sencillo, pero que haya un poco de competencia a muerte por obtener la solucion más rapida (velocidad de procesamiento).
Espero que a alguien se le ocurra alguna.
¿Por sierto, Abrimos un nuevo thread para sugerencias sobre el siguiente reto? , podríamos hacer algo en que participemos todos sin necesidad de un juez.
Por jemplo, todos participamos, y luego, los que podamos, tomamos posision neutral y testeamos que sulucion es más rapida. O inclusive, añadir como requisito que muestre el tiempo que se tardo en realizar la tarea la ejecutable.

pd: gracias otra vez por los comentarios
el siguente reto ya lo estoy de seguro lo hago en C# :P
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 16 de Agosto de 2006, 00:10
Me parece buena idea, abre entonces tu un nuevo thread para proponer el siguiente reto, lanzamos ideas y si hay varias luego hacemos una votacion.
Título: Re: Formato Bmp
Publicado por: Geo en Miércoles 16 de Agosto de 2006, 00:25
¡Ya están todos los códigos para descargar, qué bien :D!
Aprovecho para agradecer a Juank por el tiempo que invirtió en todo el reto (la organización y hasta evaluación de los códigos :bravo:), y nuevamente gracias por echarme la mano para compilar dinámicamente wxWidgets en Windows :). Gracias también por los comentarios, es cierto que no soy informático pero he entendido que debo tratar de mantener cierto orden para que a otros no les cueste tanto enteder el código (porque normalmente terminaría no con un "espagueti", sino con un "chilaquil" de código :D).

También, al igual que senzao, espero poder darle una mirada a los programas este fin de semana :).

Por cierto, creo recordar que al inicio alguien quería usar Allegro para el reto, yo adapté mi código con Allegro, luego lo pongo por aquí :).

Cita de: "Enko"
Si ese reto se hubiera hecho hace un año, me hubiera dado miedo imaginarme leer el bmp, pero ahora, resulto más facil de lo que creía si no fuera por el padding.
Yo había participado en el reto de Teleport Media, y con este reto me di cuenta de que mi código estaba mal :P, tenía error precisamente en la parte del padding.

Cita de: "Enko"
Estaría bueno hacer un reto sencillo, pero que haya un poco de competencia a muerte por obtener la solucion más rapida (velocidad de procesamiento).
Espero que a alguien se le ocurra alguna.
¿Por sierto, Abrimos un nuevo thread para sugerencias sobre el siguiente reto? , podríamos hacer algo en que participemos todos sin necesidad de un juez.
Por jemplo, todos participamos, y luego, los que podamos, tomamos posision neutral y testeamos que sulucion es más rapida. O inclusive, añadir como requisito que muestre el tiempo que se tardo en realizar la tarea la ejecutable.
Estoy de acuerdo con la idea de no tener juez, siento (y no creo estar equivocado) que aquí puede funcionar bien, que unos a otros nos demos comentarios sobre los códigos, sirve que quienes no se animaron (o no se animen en los próximos retos) puedan "seguir el reto" :).

Cita de: "Enko"
el siguente reto ya lo estoy de seguro lo hago en C# :P
Je, yo también tengo la intención de aprender C#, pero voy poquito a poquito porque todavía me falta con C++ (soy electrónico, no informático, pero me interesa mucho dominar la POO para no tener problemas cuando la requiera, la voy a aplicar a algún juego, o en dispositivos embebidos donde se maneje Java :P).

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: Enko en Miércoles 16 de Agosto de 2006, 01:03
Citar
me interesa mucho dominar la POO para no tener problemas cuando la requiera
Ese es un paso que cuesta. Pero aún más dificil y doloroso es pasar de POO a ASM. (esa es una patada en los "#$%·$%") jaja
Pero te aseguro que la POO de C# es más transparente que C++ (por ejemplo no tener que poner "->" ni tampoco "::" para acceder a los miembors).
Debo admitir que de Object Pascal de Delphi no me está costanto entender la POO de C#, salgo por unas minimas diferencias. Lo que cuesta es no tener que consultar a cada rato referencias sobre el lenguaje por los nombres de las funciones más comunes (System.Convert por ejemplo, esa fue la primera que busque :P).
Citar
Estoy de acuerdo con la idea de no tener juez, siento (y no creo estar equivocado) que aquí puede funcionar bien, que unos a otros nos demos comentarios sobre los códigos, sirve que quienes no se animaron (o no se animen en los próximos retos) puedan "seguir el reto"
Además así todos participamos. Y como hay un requisito, tener "el codigo más rapido"  da un ambito divertido de competencia. Lo malo es que no podriamos hacer un reto con "el codigo mas corto" porque usamos distinots lenguajes, pero ese no es el más importante...
Título: Re: Formato Bmp
Publicado por: Geo en Miércoles 16 de Agosto de 2006, 01:16
Cita de: "Enko"
Citar
me interesa mucho dominar la POO para no tener problemas cuando la requiera
Ese es un paso que cuesta. Pero aún más dificil y doloroso es pasar de POO a ASM. (esa es una patada en los "#$%·$%") jaja
Jajajaja  :lol: Te refieres a ASM para la PC ¿verdad?, porque en microcontroladores y otros similares ASM es el "pan nuestro de cada día", bueno, también el C :).

Cita de: "Enko"
Pero te aseguro que la POO de C# es más transparente que C++ (por ejemplo no tener que poner "->" ni tampoco "::" para acceder a los miembors).
Debo admitir que de Object Pascal de Delphi no me está costanto entender la POO de C#, salgo por unas minimas diferencias.
Por ello es que tengo tanto interés de manejarme bien en C++, una vez que lo logre espero que C# (y Java) me sean mucho más accesibles :). Ahorita estoy iniciando el capítulo sobre polimorfismo del libro que me compré hace algún tiempo (y que había dejado por un rato :P). Y si, C# me ha llamado mucho la atención, y no me ha resultado tan difícil el poder "leer" algunos programas :).

Saludos,
JJ (Geo).
Título: Re: Formato Bmp
Publicado por: senzao18 en Miércoles 16 de Agosto de 2006, 01:44
Cuando hagan el post ponganlo aqui para poder enterarme eh  <_<  :gracias:
Título: Re: Formato Bmp
Publicado por: Danielo en Miércoles 16 de Agosto de 2006, 05:01
:bravo: También a mi me gustaron tus comentarios  :rolleyes:  sobre los proyectos JuanK, voy a ver si este finde le doy una mirada a los otros programas  :comp:

En cuanto al manejo de memoria, aprovecho a preguntarte que dimensiones tenia el bmp que reventó. A lo mejor era mayor a 1024x768 y revento porque superó el tamaño maximo de la matriz que definí.
Ya se que tendría que haber utilizado una matriz dinámica en lugar de una estática, pero por alguna extraña razón el gasto de memória era mucho mayor y reventaba con bmp's no muy grandes :blink:

Bueno, este reto me gustó mucho, la verdad que al principio no creí que mi programa llegara a funcionar... en el camino me di cuenta que no estaba solo  :D  pues fueron varios los que me dieron una mano, y al final salió  :jumpie: y aprendí varias cosas que al principio no sabía y que posiblemente pueda aplicar en un futuro no muy lejano, tal vez en el próximo reto, no lo se... y otra cosa que me gustó fue que se dio la posibilidad de compartir conocimiento (inteligencia colectiva), de alguna manera todos aprendimos algo de los demás.... cosa que desgraciadamente no sucede muy a menudo  :(

No se como será el próximo reto, pero igualmente me gustaría participar. :comp:
Título: Re: Formato Bmp
Publicado por: JuanK en Miércoles 16 de Agosto de 2006, 06:09
Esta es la nueva publicacion:

http://foros.solocodigo.com/index.php?show...t=0&#entry81497 (http://foros.solocodigo.com/index.php?showtopic=23368&st=0&#entry81497)


Los invito a participar.