Advertisement
AntonioVillanueva

Escritura de fichero *.bmp dibujo cuadrado

Apr 18th, 2023
1,228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.70 KB | None | 0 0
  1. /*
  2.  Escritura y dibujo de un cuadrado en fichero *.bmp .
  3.  Antonio Villanueva Segura
  4.  
  5. La estructura de un archivo BMP es la siguiente:
  6.  
  7.     La cabecera del archivo (14 bytes) contiene información básica sobre el archivo,
  8.     como su tamaño, tipo y posición del inicio de los datos de imagen.
  9.  
  10.     La cabecera de información de la imagen (40 bytes) contiene información detallada sobre la imagen,
  11.     como su ancho X, altura Y, profundidad de color y compresión.
  12.    
  13.     Los datos de la imagen en sí comienzan inmediatamente después de la cabecera de información de la imagen.
  14.  
  15.     Cada fila de píxeles en los datos de la imagen consiste en una serie de bytes
  16.     que representan los valores de los píxeles de izquierda a derecha.
  17.     Si el ancho de la imagen no es un múltiplo de 4, se deben agregar bytes de relleno al final
  18.     de cada fila para que la longitud de la fila sea un múltiplo de 4    
  19.    
  20.     padding = (4 - (X * bytes_per_pixel) % 4) % 4
  21.    
  22.     Por ejemplo, si una imagen tiene un ancho de 7 píxeles
  23.     y profundidad de color de 24 bits (3 bytes por píxel RGB),
  24.     cada fila de píxeles tendrá una longitud de 21 bytes. 7x3=21
  25.  
  26.     Pero para que la longitud de la fila sea un múltiplo de 4,
  27.     se debe agregar 1 byte de relleno al final de cada fila,
  28.     lo que resulta en una longitud total de fila de 24 bytes.
  29.  
  30. */
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34.  
  35. #define X 100
  36. #define Y 100
  37.  
  38. typedef struct {
  39.     unsigned char R, G, B;//Red Green Blue pixel
  40. } pixel;
  41.  
  42. void write_bmp(const char* filename, pixel* data, int width, int height) {
  43.     int pad_size = (4 - (width * sizeof(pixel)) % 4) % 4;//Pad al final de cada linea de imagen si no cuadra ...  
  44.    
  45.     int file_size = sizeof(pixel) * X * height + pad_size * height + 54;
  46.  
  47.  
  48.     FILE* file = fopen(filename, "wb");
  49.     if (!file) {perror("Error fichero");exit(1);}
  50.  
  51.     //Crea header de BMP
  52.     unsigned char header[54] = {
  53.         'B', 'M', 0,0,0,0, 0,0, 0,0, 54,0,0,0,
  54.         40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0
  55.     };
  56.     *(int*)&header[2] = file_size;
  57.     *(int*)&header[18] = width;
  58.     *(int*)&header[22] = height;
  59.     *(int*)&header[34] = file_size - 54;
  60.  
  61.     fwrite(header, 1, 54, file);//Escribe header en imagen.bmp
  62.  
  63.     for (int y = height-1; y >= 0; y--) {
  64.         for (int x = 0; x < width; x++) {//Escribe linea de imagenes en imagen.bmp
  65.             fwrite(&data[y*width + x], 1, sizeof(pixel), file);
  66.         }
  67.         unsigned char pad[3] = { 0 };//Escribe pad al final de la linea en imagen.bmp
  68.         fwrite(pad, 1, pad_size, file);
  69.     }
  70.  
  71.     fclose(file);
  72. }
  73.  
  74. void clear_image(pixel * image){
  75.     // Todos los píxeles en blanco
  76.     for (int i = 0; i < X*Y; i++) {//Recorre todos los pixels
  77.         image[i].R = 255;
  78.         image[i].G = 255;
  79.         image[i].B = 255;
  80.     }  
  81. }
  82.  
  83. //Dibuja un pixel dada unas coordenadas
  84. void write_pixel (pixel *image , int x , int y){
  85.    
  86.         image[x+(y*Y)].R = 0;
  87.         image[x+(y*Y)].G = 0;
  88.         image[x+(y*Y)].B = 255;
  89. }
  90.  
  91. //Dibuja un cuadrado
  92. void crea_cuadrado (pixel* image){
  93.    
  94.     for (int x = 10; x < X-10; x++) {//Recta superior
  95.         write_pixel(image, x, 10);
  96.     }  
  97.  
  98.     for (int x = 10; x < X-10; x++) {//Recta inferior
  99.         write_pixel(image, x, Y-10);
  100.     }    
  101.    
  102.     for (int y = 10; y < Y-10; y++) {//Recta Izquierda
  103.         write_pixel(image, 10, y);
  104.     }      
  105.    
  106.     for (int y = 10; y < Y-10; y++) {//Recta Derecha
  107.         write_pixel(image, X-10, y);
  108.     }      
  109.    
  110. }
  111. int main() {
  112.     pixel* image = (pixel*)malloc(X*Y*sizeof(pixel));
  113.  
  114.     clear_image(image);
  115.  
  116.     crea_cuadrado(image);//Dibuja un cuadrado
  117.  
  118.     // Escribe el fichero imagen.bmp utiliza image y su tam. X Y
  119.     write_bmp("imagen.bmp", image, X, Y);
  120.  
  121.     free(image);//Libera la memoria
  122.  
  123.     return 0;
  124. }
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement