Few things to remember1) 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: Textancho= (BMPwith * bytesPerPixel);... ancho+= ancho%4;bitsize = ancho * alto_imagen;
Hola!!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: Textwhile (bytesLineaRelleno % 4 != 0) bytesLineaRelleno++;
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;
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).
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; ¿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;
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 < X Código: Text result := X and not 3; 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.
Estoy en el módulo Dibujo y tengo algunas dudas con la información del cabezal del archivo bmp:Código: Texttypedef 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; 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; ¿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 */
unsigned int importantcolours; /* Important colours
Código: Text ancho = (ancho + 3) & ~3; */ alineado en 4 bytes*/
como demonios devil.gif se deduce eso scream.gif question.gif
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 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. Un saludo!