- ¿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??
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.
* 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.
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).
Diodo, tecnicamente se puede decir que usar elipses es trampa, porque si puedes usar tecnicas para dibujar directamente.CitarDecidi 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....arp11152001.asp)
Este en especial:
http://msdn2.microsoft.com/en-us/library/5ey6h79d.aspx (http://msdn2.microsoft.com/en-us/library/5ey6h79d.aspx)
*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
Y si uso librerias como Gtk, Tk o wxWidgets dibujando pixel por pixel?DEpende de como las uses, revisa las reglas.
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;
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.
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
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?
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?Me parece que el lo esta haciendo en Delphi y no en C#.
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#.
He agregado documentacion en los criterios a evaluar
Finished :smartass:Ya decia yo que se te demoraba mucho, imagino que lo hiciste usando la copia de los apuntadores ( Marshall).
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.CitarHe 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
Asi es pero el comentario es para que no se despisten los que lo estan haciendo en C#.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?Me parece que el lo esta haciendo en Delphi y no en C#.
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#.
Pero si lo interesante es participar :D. Ya, al final (muchas veces pasa), no hay ganador ni nada, pero todos aprendemos compartiendo.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.
Saludos,
JJ (Geo).
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.
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 utilidadYa 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.
mmm no tendien muy bien....Resumen:
Se tiene que pedir un archivo bmp y que luego me lo muestre???
O tengo que redibujarlo???
Me hice bolas....
AhPero de todas maneras el reto esta muy facil, prueba y veraz.
jajaja se me hacia demasiado facil solo seleccionar y mostrar...
Sip, pero no se como sucede. Todavía no logro reproducir la amanera uqe sucede el error: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?Me parece que el lo esta haciendo en Delphi y no en C#.
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#.
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.Cita de: "JuanK"no :comp: :devil:Ademas supongo uqe tampoco vale usar MATRICES DINAMICAS PREDEFINIDAS como en Visual Basic por ejemplo, ¿o no?
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 :(
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.
Cita de: "Eternal Idol"Sip, pero no se como sucede. Todavía no logro reproducir la amanera uqe sucede el error: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?Me parece que el lo esta haciendo en Delphi y no en C#.
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#.
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.
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.
oK , LA INFROMACION ESTA DEVUELTA.
Mi solucion, si mal no estoy es:Código: Text
ancho= (BMPwith * bytesPerPixel); ... ancho+= ancho%4; bitsize = ancho * alto_imagen;
Hola!!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:
La verdad es que creo que esta mal. La solucion seria:Código: Text
if (ancho%4 != 0 ) ancho += (4 - ancho%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!!
Código: Text
while (bytesLineaRelleno % 4 != 0) bytesLineaRelleno++;
padWidth := FWidth mod 4;Basicamente los que hace es:
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;
Asi es enko.CitarpadWidth := FWidth mod 4;Basicamente los que hace es:
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;
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).
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: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.
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 :(
ancho = (ancho + 3) & ~3;
ancho := (ancho + 3) and not 3;
Hasta ahi creo que hemos entendido todos... pero aun queda la gran duda de:Citarancho = (ancho + 3) & ~3;Citarancho := (ancho + 3) and not 3;
Esto devuelve un numero multiplo de 4 menor a X. Es decir:
Multiplo de 4 < XCódigo: TextPor eso es ancho + 3, para que al devolver el menor, sea en realidad el acho + los bytes extra.
result := X and not 3;
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:
Estoy en el módulo Dibujo y tengo algunas dudas con la información del cabezal del archivo bmp:Bueno debi extenderme un poco mas:Código: TextNo 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:
typedef struct { unsigned int size; /* Header size in bytes */ int width,height; /* Width and height of image */ unsigned short int planes; /* Number of colour planes */ unsigned short int bits; /* Bits per pixel */ unsigned int compression; /* Compression type */ unsigned int imagesize; /* Image size in bytes */ int xresolution,yresolution; /* Pixels per meter */ unsigned int ncolours; /* Number of colours */ unsigned int importantcolours; /* Important colours */ } INFOHEADER;
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 :(
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
unsigned int importantcolours; /* Important coloursNo se, supongo que informacion nada mas.
Código: Text
ancho = (ancho + 3) & ~3; */ alineado en 4 bytes*/
como demonios devil.gif se deduce eso scream.gif question.gifCreo 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.Citarcomo demonios devil.gif se deduce eso scream.gif question.gifCreo 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.
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.
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 :DSi esa es la idea, creo que todos aprenderemos mucho con esto.
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:
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:.
A mi me falta hacer el leeme.txt y acomodar un poco la gui.oops :blink:
APA :rolleyes: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
enko, daniel y los demas como van con su reto?
usar GDI es suicidio :scream:Citarenko, 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.gifSi, es un suicidio :( , de alguna manera ya lo había captado tal vez de forma subliminal mientras buscaba info en internet :scream:
No, es broma, tan dificil.
averigua en gdi acerca de lock bytes :smartass:http://winapi.conclase.net/ (http://winapi.conclase.net/)
¡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.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.
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).
verigua en gdi acerca de lock bytesNo encontré mucho sobre lock bytes, pero por lo poco que vi y entendí :( me parece que :think: ¿es para trabajar con DirectX?
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.
Hola Geo:Citarverigua en gdi acerca de lock bytesNo encontré mucho sobre lock bytes, pero por lo poco que vi y entendí :( me parece que :think: ¿es para trabajar con DirectX?Citarhttp://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
COLORREF SetPixel( HDC hdc, // manipulador a contexto de dispositivo int X, // coordenada x del pixel int Y, // coordenada y del pixel COLORREF crColor // color del pixel );
Aún no la he probado (falta de tiempo), pero creo que funcionará :rolleyes:
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.
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:
Hola Geo:Jeje, Danielo es quien está trabajando con la WinAPI, yo estoy con wxWidgets :P.
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.
No, Diodo y Yo hemos usado C#.NET, Danielo y Geo C++, Eugenio Enko ha usado Pascal ( Delphi).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.
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.
bitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);
al parecer sobra el primero.Citarbitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);
De todas formas, ¿donde va exactamente el parentesis que falta? :alien:
Estoy teniendo problemas con la matriz de colores que la definí de la siguiente manera:¿Y cómo realizas la lectura de tu matriz de colores?Código: Text... porque como estoy utilizando SetPixel, que tiene la sintaxis:
struct TMatriz{ COLORREF **coords; int maxX,maxY; }; Código: Text... 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.
COLORREF SetPixel( HDC hdc, // manipulador a contexto de dispositivo int X, // coordenada x del pixel int Y, // coordenada x del pixel COLORREF crColor // color del pixel );
Lo que se me ocurrió entonces fue cambiar COLORREF por unsigned char, o sea:Código: Text
struct TMatriz{ unsigned char **coords; int maxX,maxY; };
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?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:
HolaCitarbitsize = (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:
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.
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.
BGRBGRBGRBGRBGRUCada letra es un byte, B, G y R representan componentes de color, y U es un byte de relleno para que la línea tenga un número de bytes múltiplo de 4 (16, en este caso).</li>
BGRBGRBGRBGRBGRU
BGRBGRBGRBGRBGRU
BGRBGRBGRBGRBGRU
BGRBGRBGRBGRBGRU
Hola: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
Pero aun no me has enviado tus fuentes actualizados.
De hecho al final lo lei todo de una vez... A mi tambien me parecio mas optima una sola peticion de lectura :D
Saludos!
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.Gracias Geo!!... ahora siiiii!!! los bitmaps aparecen con todos sus colores!! :bravo:
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 :).
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
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
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
He resuelto lo del padding despues de tanto buscar en internet jejeeAcaso nadie lee los posts del thread? :devil:
He resuelto lo del padding despues de tanto buscar en internet jejeeComo 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:
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 :(.
Una cosa, ¿con qué lenguaje estás trabajando :D?
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....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.
Si, son los que te mande...Cita de: "Nagisa"Pero aun no me has enviado tus fuentes actualizados.
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... [/QUOTE]
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:ya me parecía raro que no existiera algo parecido a los InputBox :D .
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).
asi es. :comp:Entonces cual es el problema que tiene Danielo :blink:
Lo que pasa es que cuando se abre un fichero en C++ con fopen y el archivo tiene path, hay que abrirlo así :( :sigo sin entender tu problema... es decir y que hay con eso. por eso no te puede fallar ;)Código: Textmás info en: http://www.zator.com/Cpp/E5_5_2a.htm (http://www.zator.com/Cpp/E5_5_2a.htm)
FILE* handle = fopen("D:\\path-name\\fichero.nnn", "r+b");
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: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í :( :sigo sin entender tu problema... es decir y que hay con eso. por eso no te puede fallar ;)Código: Textmás info en: http://www.zator.com/Cpp/E5_5_2a.htm (http://www.zator.com/Cpp/E5_5_2a.htm)
FILE* handle = fopen("D:\\path-name\\fichero.nnn", "r+b");
Saludos,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).
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:
y le has hecho debug paso a paso?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.
que cadena esta llegando al propceso del bitmap cuando ocurre el llamado? :rolleyes:
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:
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.
sugerencia...Muchas gracias por tu interés y ayuda JuanK, pero... acabo de descubrir donde estaba el ERROR :jumpie:
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
invalidate:D Lo más parecido a invalidate que encontré fue:
usa invalidate para forzar el refresco de la ventana.
agradezco a todos los que me ayudaron y ahora entiendo un poco como funciona la win32 Bored API ;)JEJEJEJE :lol:
Diodo : En algunos casos muestra la imagen de forma irregular( me habias dicho que lo habias corregido? es que no tengo mas copias
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.
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).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" :).
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.
el siguente reto ya lo estoy de seguro lo hago en C# :PJe, 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).
me interesa mucho dominar la POO para no tener problemas cuando la requieraEse 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
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...
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 :).Citarme interesa mucho dominar la POO para no tener problemas cuando la requieraEse 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).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 :).
Debo admitir que de Object Pascal de Delphi no me está costanto entender la POO de C#, salgo por unas minimas diferencias.