Publi

  • Leyendo archivos de imagen en formato BMP en C

    n1214332197_30461081_3311160

    Hoy vamos a practicar a leer una imagen desde un archivo BMP desde C. Aunque existen muchas APIs disponibles que son capaces de hacerlo, y mucho mejor que lo que voy a plantear (puesto que nos limitaremos a BMPs sin compresión y a 24bits por pixel), es un buen ejercicio para leer archivos con un formato especificado y documentado.

    Para este tipo de archivos, tendremos dos cabeceras disponibles, la primera será la cabecera de fichero, y la segunda, la cabecera de información de imagen, que las definimos aquí:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    typedef struct bmpFileHeader
    {
      /* 2 bytes de identificación */
      uint32_t size;        /* Tamaño del archivo */
      uint16_t resv1;       /* Reservado */
      uint16_t resv2;       /* Reservado */
      uint32_t offset;      /* Offset hasta hasta los datos de imagen */
    } bmpFileHeader;

    typedef struct bmpInfoHeader
    {
      uint32_t headersize;      /* Tamaño de la cabecera */
      uint32_t width;               /* Ancho */
      uint32_t height;          /* Alto */
      uint16_t planes;                  /* Planos de color (Siempre 1) */
      uint16_t bpp;             /* bits por pixel */
      uint32_t compress;        /* compresión */
      uint32_t imgsize;     /* tamaño de los datos de imagen */
      uint32_t bpmx;                /* Resolución X en bits por metro */
      uint32_t bpmy;                /* Resolución Y en bits por metro */
      uint32_t colors;              /* colors used en la paleta */
      uint32_t imxtcolors;      /* Colores importantes.
    Leer artículo completo
  • Limpiar el buffer de teclado en Linux con ejemplos en C y C++

    reducida

    A veces, mientras se está desarrollando un pequeño programa en C en el que hay entradas del usuario por teclado, hay veces que parece que se pulsan teclas solas, esto es debido a una entrada de teclado anterior que no ha llegado a volcarse entera en nuestras variables.
    Un ejemplo en cuestión lo tenéis aquí:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdlib.h>
    #include <stdio.h>

    #define MAX_NOMBRE 128

    int main(int argc, char *argv[])
    {
      char nombre[MAX_NOMBRE];
      int dia, mes, year;

      printf ("Introduce fecha de finalización (dd/mm/YYYY): ");
      scanf("%d/%d/%d", &dia, &mes, &year);
      printf ("Nombre de la tarea: ");
      fgets(nombre, MAX_NOMBRE, stdin);

      printf("La tarea %s termina el: %d/%d/%d\n", nombre, dia, mes, year);
      return EXIT_SUCCESS;
    }

    En un primer momento, cuando introducimos la fecha, tenemos que introducir «12/12/2010» por ejemplo y luego pulsar enter para que scanf() pueda finalizar, aunque esa pulsación de enter se queda almacenada en el buffer de teclado, siendo lo único que hay en el buffer en este momento.… Leer artículo completo