Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Escritura y dibujo de un cuadrado en fichero *.bmp .
- Antonio Villanueva Segura
- La estructura de un archivo BMP es la siguiente:
- La cabecera del archivo (14 bytes) contiene información básica sobre el archivo,
- como su tamaño, tipo y posición del inicio de los datos de imagen.
- La cabecera de información de la imagen (40 bytes) contiene información detallada sobre la imagen,
- como su ancho X, altura Y, profundidad de color y compresión.
- Los datos de la imagen en sí comienzan inmediatamente después de la cabecera de información de la imagen.
- Cada fila de píxeles en los datos de la imagen consiste en una serie de bytes
- que representan los valores de los píxeles de izquierda a derecha.
- Si el ancho de la imagen no es un múltiplo de 4, se deben agregar bytes de relleno al final
- de cada fila para que la longitud de la fila sea un múltiplo de 4
- padding = (4 - (X * bytes_per_pixel) % 4) % 4
- Por ejemplo, si una imagen tiene un ancho de 7 píxeles
- y profundidad de color de 24 bits (3 bytes por píxel RGB),
- cada fila de píxeles tendrá una longitud de 21 bytes. 7x3=21
- Pero para que la longitud de la fila sea un múltiplo de 4,
- se debe agregar 1 byte de relleno al final de cada fila,
- lo que resulta en una longitud total de fila de 24 bytes.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #define X 100
- #define Y 100
- typedef struct {
- unsigned char R, G, B;//Red Green Blue pixel
- } pixel;
- void write_bmp(const char* filename, pixel* data, int width, int height) {
- int pad_size = (4 - (width * sizeof(pixel)) % 4) % 4;//Pad al final de cada linea de imagen si no cuadra ...
- int file_size = sizeof(pixel) * X * height + pad_size * height + 54;
- FILE* file = fopen(filename, "wb");
- if (!file) {perror("Error fichero");exit(1);}
- //Crea header de BMP
- unsigned char header[54] = {
- 'B', 'M', 0,0,0,0, 0,0, 0,0, 54,0,0,0,
- 40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0
- };
- *(int*)&header[2] = file_size;
- *(int*)&header[18] = width;
- *(int*)&header[22] = height;
- *(int*)&header[34] = file_size - 54;
- fwrite(header, 1, 54, file);//Escribe header en imagen.bmp
- for (int y = height-1; y >= 0; y--) {
- for (int x = 0; x < width; x++) {//Escribe linea de imagenes en imagen.bmp
- fwrite(&data[y*width + x], 1, sizeof(pixel), file);
- }
- unsigned char pad[3] = { 0 };//Escribe pad al final de la linea en imagen.bmp
- fwrite(pad, 1, pad_size, file);
- }
- fclose(file);
- }
- void clear_image(pixel * image){
- // Todos los píxeles en blanco
- for (int i = 0; i < X*Y; i++) {//Recorre todos los pixels
- image[i].R = 255;
- image[i].G = 255;
- image[i].B = 255;
- }
- }
- //Dibuja un pixel dada unas coordenadas
- void write_pixel (pixel *image , int x , int y){
- image[x+(y*Y)].R = 0;
- image[x+(y*Y)].G = 0;
- image[x+(y*Y)].B = 255;
- }
- //Dibuja un cuadrado
- void crea_cuadrado (pixel* image){
- for (int x = 10; x < X-10; x++) {//Recta superior
- write_pixel(image, x, 10);
- }
- for (int x = 10; x < X-10; x++) {//Recta inferior
- write_pixel(image, x, Y-10);
- }
- for (int y = 10; y < Y-10; y++) {//Recta Izquierda
- write_pixel(image, 10, y);
- }
- for (int y = 10; y < Y-10; y++) {//Recta Derecha
- write_pixel(image, X-10, y);
- }
- }
- int main() {
- pixel* image = (pixel*)malloc(X*Y*sizeof(pixel));
- clear_image(image);
- crea_cuadrado(image);//Dibuja un cuadrado
- // Escribe el fichero imagen.bmp utiliza image y su tam. X Y
- write_bmp("imagen.bmp", image, X, Y);
- free(image);//Libera la memoria
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement