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);
Citarbitsize = (ancho_imagen * ((bpp + 7) / 8) * abs(alto_imagen);De todas formas, ¿donde va exactamente el parentesis que falta?
Estoy teniendo problemas con la matriz de colores que la definí de la siguiente manera:Código: Textstruct TMatriz{ COLORREF **coords; int maxX,maxY; }; ... porque como estoy utilizando SetPixel, que tiene la sintaxis:Código: TextCOLORREF 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 ); ... 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: Textstruct 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?
Citarbitsize = (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?
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...
Los colores de la imagen estan a partir del 15° Byte.
BGRBGRBGRBGRBGRUBGRBGRBGRBGRBGRUBGRBGRBGRBGRBGRUBGRBGRBGRBGRBGRUBGRBGRBGRBGRBGRU
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
De hecho al final lo lei todo de una vez... A mi tambien me parecio mas optima una sola peticion de lectura 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.Porque, ahora habría que ver cómo estás pintando la matriz al HDC . 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
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...
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 regresa70, 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 jejee
He resuelto lo del padding despues de tanto buscar en internet jejeeMi 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 imagenpor 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 regresa70, 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 .